有两个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 conversion
比class -> int -> standard conversion to bool