C++ bool 表达式作为函数参数调用错误的重载
Posted
技术标签:
【中文标题】C++ bool 表达式作为函数参数调用错误的重载【英文标题】:C++ bool expression as function argument calls wrong overload 【发布时间】:2017-06-25 02:59:31 【问题描述】:在下面的测试程序中,使用 bool 谓词调用 checkit
方法而不是调用整数重载。为什么?
(i == 10)
应该创建一个布尔值,然后应该触发 bool 重载被调用,不是吗?
程序输出
should be int
I'm a bool 1
should be bool
I'm a bool 1
should also be bool
I'm a int 1
来源
class Overload
public:
void checkIt(bool n) printf(" I'm a bool %d\n", n);
void checkit(long n) printf(" I'm a long %ld\n", n);
void checkit(int n ) printf(" I'm a int %d\n", n);
;
int main(int argc, char *argv[])
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkit( (i == 10) );
编辑
呃!抱歉打错了。
然而,在修正错别字并注释掉 bool 方法之后,int 方法会被 bool 谓词调用。如果找不到更合适的签名,是否有从 bool 到 int 的默认转换?严格来说,没有bool
签名,所以我期待编译或运行时错误......
更新代码
class Overload
public:
//void checkIt(bool n) printf(" I'm a bool %d\n", n);
void checkIt(long n) printf(" I'm a long %ld\n", n);
void checkIt(int n ) printf(" I'm a int %d\n", n);
;
int main(int argc, char *argv[])
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkIt( (i == 10) );
更新输出
should be int
I'm a int 10
should be bool
I'm a int 1
should also be bool
I'm a int 1
【问题讨论】:
您只有一个名为checkIt
的函数的重载,所以这是唯一可以调用的函数。具有不同名称的函数有两个不相关的重载,checkit
。
看起来像是一个错字。将所有checkit
更改为checkIt
可以获得预期结果。
是的,有一个从bool
到int
的标准转换。
【参考方案1】:
checkIt
没有过载;只有bool
版本。
checkit
过载;有一个long
和一个int
版本。
您的代码调用了两次checkIt
和一次checkit
。
【讨论】:
反过来:一个checkIt
,两个checkit
s
@IgorTandetnik 已编辑。
感谢 melphomene,你拯救了我的睡眠,我以为快疯了 :-)【参考方案2】:
请记住,C++ 中的函数名称(以及几乎所有其他名称)都是 CaSe SeNsItIvE。
在您更新的代码中,有两种checkIt
方法,一种用于int
类型,一种用于long
类型。您调用了 checkIt
3 次,最后 2 次您将 bool
值传递给方法。在 C++ 中,bool
值自动转换为 int
与 true == 1
和 false == 0
bool a = 1 // equals to true
bool b = 0 // equals to false
由于没有接受 'bool' 类型的方法,该值会自动转换为 int
并调用 int
方法。
【讨论】:
【参考方案3】:是的 C++ 使用隐式转换。bool,char 自动转换为 int /short/long 或反之亦然。
【讨论】:
以上是关于C++ bool 表达式作为函数参数调用错误的重载的主要内容,如果未能解决你的问题,请参考以下文章