我們有以下使用 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\14.29.30037\include\xstddef(198): message : see declaration of 'std::equal_to<void>::operator ()'
為了解決這個問題,您還必須使用.get<size_t>()才能使完美轉發作業。
uj5u.com熱心網友回復:
您只需更換
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模板引數未正確更新)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405359.html
標籤:
下一篇:禁用模板內的方法評估
