作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑以下代码:
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会发生:
A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.
我知道这样的行为在if (ptr)
语句中很方便,但对我来说,在传递参数的情况下,这显然是错误的,也是bug的来源。
最佳答案
您可以将指针的 foo
重载声明为 deleted
:
template <class T>
void foo(T*) = delete;
或者更好的是,正如@Ted 评论的那样,只需声明一个 Vanilla 重载即可不编译任何隐式转换:
template <class T>
void foo(T) = delete;
关于c++ - 在 GCC 中避免或警告从 const char* 到 bool 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54515792/
我是一名优秀的程序员,十分优秀!