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 可以获得预期结果。 是的,有一个从boolint 的标准转换。 【参考方案1】:

checkIt 没有过载;只有bool 版本。

checkit 过载;有一个long 和一个int 版本。

您的代码调用了两次checkIt 和一次checkit

【讨论】:

反过来:一个checkIt,两个checkits @IgorTandetnik 已编辑。 感谢 melphomene,你拯救了我的睡眠,我以为快疯了 :-)【参考方案2】:

请记住,C++ 中的函数名称(以及几乎所有其他名称)都是 CaSe SeNsItIvE。 在您更新的代码中,有两种checkIt 方法,一种用于int 类型,一种用于long 类型。您调用了 checkIt 3 次,最后 2 次您将 bool 值传递给方法。在 C++ 中,bool 值自动转换为 inttrue == 1false == 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 表达式作为函数参数调用错误的重载的主要内容,如果未能解决你的问题,请参考以下文章

c++函数重载,具体步骤是啥

C++对bool operator < (const p &a)const的运算符重载详解

C++复习

C++

表达式/函数重载的编译器错误

虚函数与重载函数的区别