C++ 避免或警告GCC中从const char*到bool的隐式转换
考虑以下代码:C++ 避免或警告GCC中从const char*到bool的隐式转换,c++,gcc,implicit-conversion,gcc-warning,C++,Gcc,Implicit Conversion,Gcc Warning,考虑以下代码: void foo(bool parameter) { std::cout << parameter << "\n"; } int main() { foo("const char *argument"); } void foo(bool参数){ 标准::cout 我希望编译器在传递const char*而不是bool作为函数foo的参数时发出警告……我尝试了-Wall,-Wextra,以及-Wpedantic 您需要将-Wconvers
void foo(bool parameter) {
std::cout << parameter << "\n";
}
int main() {
foo("const char *argument");
}
void foo(bool参数){
标准::cout
我希望编译器在传递const char*
而不是bool
作为函数foo
的参数时发出警告……我尝试了-Wall
,-Wextra
,以及-Wpedantic
您需要将-Wconversion
添加到编译器标志中。请注意,这似乎适用于clang
(最新或旧版本),但不适用于gcc
如果这触发了太多您不想处理的警告,您可以有选择地启用(clang
)您可以将指针的foo
重载声明为已删除
:
template <class T>
void foo(T*) = delete;
模板
void foo(T*)=删除;
或者更好的是,作为@Ted注释,只需声明一个香草重载,不编译任何隐式转换:
template <class T>
void foo(T) = delete;
模板
void foo(T)=删除;
…对于不好的惊喜有好处:如果有一个函数接受std::string
,另一个函数接受bool
,猜猜哪个函数被选为“const char*argument”
(剧透警报:是的,第二个-它让我发疯,直到我得到线索。);-)有点离题,但我不明白为什么你认为使用bool
参数会是糟糕的编码风格。@user463035818“鲍勃叔叔这么说的”这可能是一个很好的理由。他认为带有bool
参数的函数从来没有一个单独的责任。不过Bob叔叔对编码有很多强烈的意见。@Yksisarvinen你的意思是应该有一个fooTrue
和一个fooFalse
?嗯,也许在某些情况下我可以同意,但在一般情况下,如果Bob因此,必须有一些事实来解释转换是C++语言中最大的错误之一。隐式整数转换可能是错误的最大的一般来源之一,在指针之外。这是一个很好的问题,并且对您思考如何设计防止代码中的错误的接口感到敬佩。尝试过但没有运气:。我监督过什么吗?@Scheff奇怪,它在clang
和gcc
中的处理方式似乎不同。相应地更新了答案。我刚刚发现了这一点,事实上从const char*
到bool
的隐式转换根本没有提到。看起来它在gcc中没有涉及…@Schefffwiw也没有错,但在现实世界的示例中,这些可能是(多个)函数(甚至可能来自其他文件/源)从C++11开始,您实际上应该将其声明为deleted
…这将生成更早、更有意义的错误消息。或者,如果T
不是bool
则使用一个引发static\u assert
的主体来声明它(如果模板总是引发一个static\u assert
,则该模板是格式错误的,这是进行此检查的唯一原因)…或者只是void foo(T)=delete;
删除所有隐式转换。