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()具有类型TypesafeBool和false类型bool.您可以在它们之间进行转换,但是Comeau不知道您要使用哪个.要解决它,将三元组的一侧投射到另一侧的类型:(1=1) ? f() : TypesafeBool(false).
Comeau在这里是正确的,因为虽然对观察者来说显而易见的是结果应该采用什么类型,但是三元表达式需要单独使用一个类型,而不需要引用它所使用的类型,它应该选择的类型是不明确的.