C++如何防止编译器在调用函数时进行隐式转换

C++ how do i keep compiler from making implicit conversions when calling functions?

本文关键字:转换 函数 何防止 编译器 调用 C++      更新时间:2023-10-16

交易如下:

当我有一个默认参数的函数,比如这个

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