C ++如何在调用函数时让编译器不进行隐式转换?

时间:2013-11-29 10:29:34

标签: c++ casting default implicit explicit

这是交易:

当我有一个像这样的默认参数的函数

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)

有这样的方法吗?

2 个答案:

答案 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);