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

时间:2019-02-04 12:09:25

标签: c++ gcc implicit-conversion gcc-warning

考虑以下代码:

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

int main() {
    foo("const char *argument");
}

我希望编译器在传递const char*而不是bool作为函数foo的参数时发出警告。

但是GCC隐式转换它。我尝试了-Wall-Wextra-Wpedantic,但是没有一个发出警告。是否有一个标记可以捕获这种隐式转换(无效的参数类型)?

忽略该函数具有类型为bool的参数的事实,有些人可能将其视为错误的代码样式。我无法重构那一部分。

该标准仅提到会发生这样的implicit conversion

  

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

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

2 个答案:

答案 0 :(得分:27)

对于指针为foo,可以声明deleted的重载:

template <class T>
void foo(T*) = delete;

或者更好的是,作为@Ted注释,只需声明一个香草重载即可不编译任何隐式转换:

template <class T>
void foo(T) = delete;

答案 1 :(得分:16)

  

我希望编译器在传递const char*而不是bool作为函数foo的参数时发出警告。 ...我尝试了-Wall-Wextra-Wpedantic

您需要在编译器标志中添加-Wconversion。请注意,这似乎适用于clang(最新或更旧的版本),但不适用于gcc

如果这触发了您不想处理的过多警告,则可以有选择地启用-Wstring-conversion(仅clang)。