“if(var)”使用数字转换而不是布尔值

时间:2012-09-14 06:44:07

标签: c++ if-statement types

为什么if(var)...使用数字转换而不是布尔值? 我有一个实现两者的类:

operator int() { ....}
operator bool() { ....}

但如果我使用:

if (my_class_var) ....;

然后使用int转换代替boolean?!!?!

编辑: 正如versedmarald所说的那样是正确的。我发现了什么是差异......我实际上在使用:

operator int() { ....}
operator bool() const { ... }

仍然迷醉,为何与众不同? gcc版本4.6.2

3 个答案:

答案 0 :(得分:3)

如果你说的是真的,我相信你的编译器违反了标准:

  

(§6.4/ 4)作为switch语句以外的语句中的初始化声明的条件的值是上下文转换为bool的声明变量的值(第4条)。如果转换形式不正确,该程序就会形成错误。 [...]

(很明显,这是在§6.4的上下文中,它描述了ifswitch语句。)

答案 1 :(得分:1)

它没有(至少使用g++)。我的猜测是转换运算符出错。

#include <iostream>
class A {
public:
    operator int() { return 1; }
};

class B {
public:
    operator int() { return 1; }
    operator bool() { return false; }
};

int main() {
    A a;
    B b;

    if (a)
        std::cout << "true\n";
    else
        std::cout << "false\n";

    if (b)
        std::cout << "true\n";
    else
        std::cout << "false\n";
}

输出:

true
false

答案 2 :(得分:1)

有两个used-defined implicit conversion chains

首先 - class -> bool -> no conversion

第二 - class -> int -> bool

n3337 4/2

注意:具有给定类型的表达式将在多个上下文中隐式转换为其他类型:

- 在if语句或迭代语句(6.4,6.5)的条件下使用。目的地类型 是bool。

n3337 4/3

隐式转换的效果与执行隐式转换的效果相同 声明和初始化,然后使用临时变量作为转换的结果。

行情意味着真的

if (class_var) 

if (bool _ = class_var)
n3337 13.3.3 / 1

鉴于这些定义,可行函数F1被定义为比另一个可行函数更好的函数 F2如果对于所有参数i,ICSi(F1)不是比ICSi(F2)更差的转换序列,然后

- 上下文是用户定义转换的初始化(见8.5,13.3.1.5和13.3.1.6)和 从返回类型F1到目标类型的标准转换序列(即,类型的 正在初始化的实体)是比标准转换序列更好的转换序列 F2的返回类型到目标类型。 [例如:

struct A {
A();
operator int();
operator double();
} a;
int i = a; // a.operator int() followed by no conversion
//is better than a.operator double() followed by
//a conversion to int
float x = a; //ambiguous: both possibilities require conversions,
//and neither is better than the other

- 结束示例

因此,编译器应选择operator bool,因为class -> bool -> no standart conversion优于class -> int -> standard conversion to bool