C++如何防止编译器在调用函数时进行隐式转换
C++ how do i keep compiler from making implicit conversions when calling functions?
交易如下:
当我有一个默认参数的函数,比如这个
int foo (int a, int*b, bool c = true);
如果我错误地这样称呼它:
foo (1, false);
编译器会将false转换为int指针,并调用b指向0的函数。
我看到有人建议使用模板方法来防止隐式类型转换:
template <class T>
int foo<int> (int a, T* b, bool c = true);
但这种方法过于混乱,使代码变得混乱。
有显式关键字,但它只适用于构造函数。
我想要的是一个干净的方法,类似于显式方法,这样当我这样声明方法时:
(keyword that locks in the types of parameters) int foo (int a, int*b, bool c = true);
并这样称呼它:
foo (1, false);
编译器会给我这个:
foo (1, false);
^
ERROR: Wrong type in function call (expected int* but got bool)
有这样的方法吗?
不,没有这样的方法。我认为模板对这样的事情很好。然而,例如,在gcc中有标志-Wconversion-null
,对于带有foo(1, false)
的代码,它将发出警告
将«false»转换为«int foo(int,int*,bool)»[-Wconversion null]
在叮当声中有一个标志-Wbool-conversion
将类型为"int*"的指针从常量初始化为null布尔表达式[-Wbool转换]
最好的方法是正确设置警告级别,而不是忽略警告。
例如,gcc有-Wall
选项,它可以处理许多有问题的案例,并将在您的案例中显示下一个警告(g++4.8.1):
garbage.cpp: In function ‘int main(int, char**)’:
garbage.cpp:13:13: warning: converting ‘false’ to pointer type for argument 2 of ‘int foo(int, int*, bool)’ [-Wconversion-null]
foo(0,false);
相关文章:
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C++:用户定义的显式类型转换函数错误
- 为什么下面带有非常量转换函数的代码没有歧义?
- 为什么转换函数声明不需要至少一个定义类型说明符
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- C++ 通过自定义赋值运算符隐式转换函数参数
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 在C++中自动向下转换函数参数
- static_cast:转换函数模板——它们真的有效吗
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 隐式转换函数的返回对象时是否会影响性能?
- C++不存在合适的转换函数
- 为什么允许 int 和 const int 使用不同的转换函数?
- 使用转换函数直接初始化
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 为什么我会收到转换函数错误
- 选择用于赋值初始化的转换函数的优先级
- 我收到错误:没有合适的转换函数从 std::basic_istream<char、std::char_traits<char>> 到 char 存在
- 具有转换函数的 lambda,指向具有 C++ 链接的函数的指针
- 使用模板和部分专用化生成类型转换函数