4

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

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

但如果我使用:

if (my_class_var) ....;

然后使用int转换而不是boolean?!!?!

编辑:正如 versedmarald 所说,这是正确的。我发现有什么不同..我实际上正在使用:

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

还是被迷住了,为什么不一样?gcc 版本 4.6.2

4

3 回答 3

3

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

(第 6.4/4 节)作为非 switch 语句的语句中的初始化声明的条件值是根据上下文转换为 bool 的声明变量的值(第 4 条)。如果该转换格式不正确,则程序格式错误。[...]

(需要明确的是,这是在 §6.4 的上下文中描述ifswitch陈述的。)

于 2012-09-14T07:01:24.677 回答
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
于 2012-09-14T06:58:39.917 回答
1

有两个used-defined implicit conversion chains

第一的 -class -> bool -> no conversion

第二 -class -> int -> bool

n3337 4/2

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

— 当用于 if 语句或迭代语句 (6.4, 6.5) 的条件时。目标类型是布尔值。

n3337 4/3

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

行情意味着真的

if (class_var) 

if (bool _ = class_var)

n3337 13.3.3/1

鉴于这些定义,如果对于所有参数 i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,则可行函数 F1 被定义为比另一个可行函数 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 conversionclass -> int -> standard conversion to bool

于 2012-09-14T07:01:28.273 回答