如何更改 C++ 代码以使 clang-tidy modernize-use-transparent-functors 快乐
How to change c++ code to make clang-tidy modernize-use-transparent-functors happy
我们有以下使用 catch2 框架的 c++ 代码:
auto check2 = [](size_t exp, size_t val, auto comp) {
REQUIRE(comp(exp, val));
};
check2(10, 20, std::equal_to<size_t>{});
clang-tidy 生成以下内容
/test_lingua.cpp:1236:36: warning: prefer transparent functors 'equal_to<>' [modernize-use-transparent-functors]
check2(10, 20, std::equal_to<size_t>{});
^
是否可以对代码进行任何(合理的)更改让 clang-tidy 开心?
更新:
原始代码比较了size_t
和nlohmann::json
(类似于REQUIRE(comp(val, exp_dict[s]));
),使用std::equal_to<>{}
的问题导致了这个编译错误
1>test_lingua.cpp(1224,25): error C2672: 'operator __surrogate_func': no matching overloaded function found
1>test_lingua.cpp(1227): message : see reference to function template instantiation 'void maz::tests::test_superscript_remover::<lambda_afa1c9ba8dd5ae9bea1ac934f5f796ab>::()::<lambda_9d6a94e643f0b9fe3677202d1edfa8f2>::operator ()<std::equal_to<void>>(const std::string &,size_t,std::equal_to<void>) const' being compiled
1>test_lingua.cpp(1224,1): error C2893:
Failed to specialize function template 'unknown-type std::equal_to<void>::operator ()(_Ty1 &&,_Ty2 &&) noexcept(<expr>) const'
1>E:\VS019\VC\Tools\MSVC.29.30037\include\xstddef(198): message : see declaration of 'std::equal_to<void>::operator ()'
为了解决这个问题,您还必须使用 .get<size_t>()
才能完美转发。
你只需更换
std::equal_to<size_t>{}
和
std::equal_to<>{}
(C++14 及更高版本,使用模板默认参数)或
std::equal_to{}
(C++17 及以上,使用 CTAD)。
这种方式使用了 std::equal_to<void>
特化,它通常比较任何类型的两个参数 a
和 b
,就好像 a == b
(加上完美转发)。
它避免了必须再次指定正确的类型,因此您不必自己重复,这有时可能是错误的来源(例如,如果类型已更改但 std::equal_to
模板参数是未正确更新)。
我们有以下使用 catch2 框架的 c++ 代码:
auto check2 = [](size_t exp, size_t val, auto comp) {
REQUIRE(comp(exp, val));
};
check2(10, 20, std::equal_to<size_t>{});
clang-tidy 生成以下内容
/test_lingua.cpp:1236:36: warning: prefer transparent functors 'equal_to<>' [modernize-use-transparent-functors]
check2(10, 20, std::equal_to<size_t>{});
^
是否可以对代码进行任何(合理的)更改让 clang-tidy 开心?
更新:
原始代码比较了size_t
和nlohmann::json
(类似于REQUIRE(comp(val, exp_dict[s]));
),使用std::equal_to<>{}
的问题导致了这个编译错误
1>test_lingua.cpp(1224,25): error C2672: 'operator __surrogate_func': no matching overloaded function found
1>test_lingua.cpp(1227): message : see reference to function template instantiation 'void maz::tests::test_superscript_remover::<lambda_afa1c9ba8dd5ae9bea1ac934f5f796ab>::()::<lambda_9d6a94e643f0b9fe3677202d1edfa8f2>::operator ()<std::equal_to<void>>(const std::string &,size_t,std::equal_to<void>) const' being compiled
1>test_lingua.cpp(1224,1): error C2893:
Failed to specialize function template 'unknown-type std::equal_to<void>::operator ()(_Ty1 &&,_Ty2 &&) noexcept(<expr>) const'
1>E:\VS019\VC\Tools\MSVC.29.30037\include\xstddef(198): message : see declaration of 'std::equal_to<void>::operator ()'
为了解决这个问题,您还必须使用 .get<size_t>()
才能完美转发。
你只需更换
std::equal_to<size_t>{}
和
std::equal_to<>{}
(C++14 及更高版本,使用模板默认参数)或
std::equal_to{}
(C++17 及以上,使用 CTAD)。
这种方式使用了 std::equal_to<void>
特化,它通常比较任何类型的两个参数 a
和 b
,就好像 a == b
(加上完美转发)。
它避免了必须再次指定正确的类型,因此您不必自己重复,这有时可能是错误的来源(例如,如果类型已更改但 std::equal_to
模板参数是未正确更新)。