以下行为的原因是什么?
class BoolWrapper
{
public:
BoolWrapper(bool value) : value(value) {}
operator bool() const { return value; }
operator int() const { return (int) value; }
private:
bool value;
};
BoolWrapper bw(true);
if (bw) { ... } // invokes operator bool()
if (bw == true) { ... } // invokes operator int() -- why?
Run Code Online (Sandbox Code Playgroud)
这种行为有望吗?(使用GCC 4.7.2.)
从5/9开始:
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式引起转换并产生结果类型.目的是产生一个通用类型,它也是结果的类型.此模式称为通常的算术转换,其定义如下:
[一些无关紧要的浮点项目.]
否则,应对两个操作数执行整体促销(4.5).
从3.9.1/6我们看到bool有资格进行整体推广:
bool类型的值为true或false.42)[注意:没有signed,unsigned,short或long bool类型或值.]如下所述,bool值表现为整数类型.bool类型的值参与整体促销(4.5).
您的期望是基于您认为语言已经知道如何比较两个bool值的信念.实际上,它听起来并不令人惊讶.更确切地说,语言"不知道"如何直接进行.
在概念层面,C++不具有专用的内置相等比较操作bool vs. bool比较.即使你true == false在代码中写入,它实际上也被语言解释为(int) true == (int) false.到隐式转换int是由规则引入通常的算术转换和int vs. int比较之后使用.
最直接的内置运营商可以比较两个bool值是一个int vs. int比较.这是编译器在您的情况下尝试使用的运算符.而在同运营商将被用于char vs. char和short vs. short对比.
换句话说,编译器可以使用的唯一途径bool转换操作符的bw == true表达是做
(int)(bool) bw == (int) true
Run Code Online (Sandbox Code Playgroud)
这肯定不如直接"最优"
(int) bw == (int) true
Run Code Online (Sandbox Code Playgroud)
这是驱动语言选择后一种变体的逻辑.