考虑以下代码:
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)
语句中非常方便,但是对我来说,在传递参数的情况下,这显然是错误的,并且是错误的来源。
答案 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
)。