为什么if(var)...使用数字转换而不是布尔值? 我有一个实现两者的类:
operator int() { ....}
operator bool() { ....}
但如果我使用:
if (my_class_var) ....;
然后使用int
转换代替boolean
?!!?!
编辑: 正如versedmarald所说的那样是正确的。我发现了什么是差异......我实际上在使用:
operator int() { ....}
operator bool() const { ... }
仍然迷醉,为何与众不同? gcc版本4.6.2
答案 0 :(得分:3)
如果你说的是真的,我相信你的编译器违反了标准:
(§6.4/ 4)作为switch语句以外的语句中的初始化声明的条件的值是上下文转换为bool的声明变量的值(第4条)。如果转换形式不正确,该程序就会形成错误。 [...]
(很明显,这是在§6.4的上下文中,它描述了if
和switch
语句。)
答案 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