C ++ bool表达式作为函数参数调用错误的重载

时间:2017-06-25 02:59:32

标签: c++ overloading

在下面的测试程序中,使用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方法之后,使用bool谓词调用int方法。如果找不到更合适的签名,是否有从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

3 个答案:

答案 0 :(得分:3)

checkIt并未超载;只有bool个版本。

checkit超载;那里有longint版本。

您的代码调用checkIt两次,checkit调用一次。

答案 1 :(得分:0)

请记住,C ++中的函数名称(以及几乎所有其他函数)都是CaSe SeNsItIvE 在更新后的代码中,有两种checkIt方法,一种用于int类型,另一种用于long类型。您调用checkIt 3次,最后2次调用方法bool。在C ++中bool值会自动转换为int true == 1false == 0

bool a = 1 // equals to true
bool b = 0 // equals to false

由于没有方法接受' bool'类型,该值会自动转换为int并调用int方法。

答案 2 :(得分:0)

是C ++使用隐式conversion.bool,char自动转换为int / short / long,反之亦然。