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

C++ bool expression as function argument calls wrong overload

本文关键字:调用 错误 超载 参数 函数 bool 表达式      更新时间:2023-10-16

在下面的测试程序中,用bool谓词调用checkit方法,而是调用整数过载。为什么?

(i == 10)应该创建一个布尔值,然后应触发布尔超载,否?

程序输出

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 %dn", n);  }
    void checkit(long n) { printf("  I'm a long %ldn", n); }
    void checkit(int n ) { printf("  I'm a int %dn", n); }
};
int main(int argc, char *argv[])
{
    Overload obj;
    int i = 10;
    bool b = true;
    printf("should be intn");
    obj.checkIt(i);
    printf("should be booln");
    obj.checkIt(b);
    printf("should also be booln");
    obj.checkit( (i == 10) );
}

编辑

du!对不起,错字。

但是,在固定错字和评论布尔方法 之后,用bool谓词调用int方法。如果找不到更合适的签名,是否可以从布尔到int进行默认转换?严格来说,没有bool签名,所以我期望编译或运行时错误...

更新的代码

class Overload
{
public:
    //void checkIt(bool n) { printf("  I'm a bool %dn", n);  }
    void checkIt(long n) { printf("  I'm a long %ldn", n); }
    void checkIt(int n ) { printf("  I'm a int %dn", n); }
};
int main(int argc, char *argv[])
{
    Overload obj;
    int i = 10;
    bool b = true;
    printf("should be intn");
    obj.checkIt(i);
    printf("should be booln");
    obj.checkIt(b);
    printf("should also be booln");
    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不会超载;只有bool版本。

checkit被重载;有一个longint版本。

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

请记住,C 中的功能名称(几乎所有其他(都是案例敏感的。
在您的更新代码中,有2种checkIt方法,一种用于int类型,一种用于long类型。您将checkIt调用3次,最后2次将其传递给该方法为bool值。在C bool中值自动将true == 1false == 0

自动铸造为int
bool a = 1 // equals to true
bool b = 0 // equals to false

由于没有接受" bool"类型的方法,该值会自动施放到int并调用int方法。

是的c 使用隐式转换。bool,char自动转换为int/short/short/long或vice。反之亦然。