这是交易:
当我有一个像这样的默认参数的函数
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)
有这样的方法吗?
答案 0 :(得分:4)
不,没有这样的方法。我想,模板对于这样的事情是好的。但是,例如在gcc中有标记-Wconversion-null
,对于带有foo(1, false)
的代码,它会发出警告
将«false»转换为«int foo的参数2的指针类型(int, int *,bool)»[ - Wconversion-null]
并且在clang中有一个标志-Wbool-conversion
将类型为'int *'的指针从常量初始化为null 布尔表达式[-Wbool-conversion]
答案 1 :(得分:3)
最好的方法是正确设置警告级别,而不是忽略警告。
例如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);