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;
删除所有隐式转换。