【发布时间】:2019-06-28 04:09:07
【问题描述】:
考虑以下代码:
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:
整数、浮点、无范围枚举、指针和指向成员的指针类型的纯右值可以转换为布尔类型的纯右值。
我知道这种行为在if (ptr) 语句中很方便,但对我来说,在传递参数的情况下,这显然是错误的,并且是错误的来源。
【问题讨论】:
-
...也有利于意外:如果有一个函数接受
std::string而另一个接受bool,请猜猜为"const char *argument"选择了哪个函数。 (剧透警报:是的,第二个 - 它让我发疯,直到我得到一个线索。);-) -
有点离题,但我很困惑为什么你认为有一个
bool参数会是不好的编码风格.. -
@user463035818 “鲍勃叔叔这么说”可能是一个很好的理由。他认为带有
bool参数的函数从来没有单一的职责。不过,鲍勃叔叔对编码有很多强烈的看法。 -
@Yksisarvinen 你的意思是应该有一个
fooTrue和一个fooFalse代替?嗯,也许在某些情况下我可以同意,但一般情况下不同意,尽管如果 Bob 这么说,那肯定有一些道理 -
隐式转换是 C++ 语言中最大的错误之一。隐式整数转换可能是指针之外最大的一般错误来源之一。这是一个很好的问题,感谢您思考如何设计界面以防止代码中的错误。
标签: c++ gcc implicit-conversion gcc-warning