避免或警告GCC中从const char*到bool的隐式转换

Szy*_*oda 24 c++ gcc gcc-warning implicit-conversion

请考虑以下代码:

void foo(bool parameter) {
    std::cout << parameter << "\n";
}

int main() {
    foo("const char *argument");
}
Run Code Online (Sandbox Code Playgroud)

我希望编译器在传递时发出警告const char*而不是bool作为参数来发挥作用foo.

但GCC暗中转换它.我想-Wall,-Wextra-Wpedantic,但这些问题的警告.是否有可以捕获这种隐式转换的标志(无效的参数类型)?

忽略这个函数有一个类型参数的事实,bool有些人可能会认为这是一种糟糕的代码风格.我无法重构那部分.

该标准刚刚提到这种隐式转换将会发生:

可以将整数,浮点,无范围枚举,指针和指针到成员类型的prvalue转换为bool类型的prvalue.

我知道这种行为在if (ptr)语句中非常方便,但对于我来说,在传递参数的情况下,它显然是错误的并且是错误的来源.

Pau*_*ans 28

您可以将foo指针的重载声明为deleted:

template <class T>
void foo(T*) = delete;
Run Code Online (Sandbox Code Playgroud)

或者更好的是,作为@Ted评论,只需声明一个vanilla重载,以便不编译任何隐式转换:

template <class T>
void foo(T) = delete;
Run Code Online (Sandbox Code Playgroud)

  • 从C++ 11开始,您应该将其声明为`deleted` ...这将生成更早且更有意义的错误消息.或者,如果`T`不是`bool`,则使用一个引发`static_assert`的主体来声明它(如果模板总是引发`static_assert`,那么模板就会形成错误,这是检查的唯一原因). (4认同)
  • ...或者只是`void foo(T)= delete;`删除所有隐式转换. (3认同)
  • 没错,但在现实世界的例子中,这些可能是(多个)功能(甚至可能来自其他文件/来源),这可能会使这看起来非常令人筋疲力尽. (2认同)

lub*_*bgr 16

我希望编译器在传递时发出警告const char*而不是bool作为参数来发挥作用foo.......我想-Wall,-Wextra-Wpedantic

您需要添加-Wconversion到编译器标志.请注意,似乎适用于clang(最近或更早版本),但不适用gcc.

如果这会触发您不想处理的太多警告,则可以选择性地启用-Wstring-conversion(clang仅限).