隐式类型转换 - 编译器错误

Nav*_*een 2 c++ compiler-errors type-conversion

这个问题与这个问题有关.以下代码编译精细的VC9编译器,但在与Comeau在线编译时给出错误.任何人都可以告诉我哪一个是正确的,错误是什么意思?

错误:暧昧"?" 操作:类型"TypesafeBool"的第二个操作数可以转换为第三个操作数类型"bool",反之亦然TypesafeBool b =(1 == 1)?f():false;

class TypesafeBool
{
private:
    bool m_bValue;
    struct Bool_ { 
        int m_nValue; 
    };
    typedef int Bool_::* bool_;
    inline bool_ True() const { return &Bool_::m_nValue; }
    inline bool_ False() const { return 0; }

public:
    TypesafeBool( const bool bValue ) : m_bValue( bValue ){}
    operator bool_() const { return m_bValue ? True() : False(); }
};

TypesafeBool f()
{
    return TypesafeBool(true);
}

int main()
{
    TypesafeBool b = (1==1) ? f() : false;
}
Run Code Online (Sandbox Code Playgroud)

And*_*ett 11

错误是三元运算符必须只有一个类型,并且表达式(1=1) ? f() : false有两种类型 - f()具有类型TypesafeBoolfalse类型bool.您可以在它们之间进行转换,但是Comeau不知道您要使用哪个.要解决它,将三元组的一侧投射到另一侧的类型:(1=1) ? f() : TypesafeBool(false).

Comeau在这里是正确的,因为虽然对观察者来说显而易见的是结果应该采用什么类型,但是三元表达式需要单独使用一个类型,而不需要引用它所使用的类型,它应该选择的类型是不明确的.