与类型转换操作符一起使用时,条件运算符"?:"的编译器错误

iam*_*ind 9 c++ compiler-errors conditional-operator typecasting-operator

以下代码是最简单的形式:

struct X {
  operator char () const { return 'a'; }
};

int main ()
{
  X obj, *p = &obj;
  char a = *p;  // ok
  char c = (true)? *p : 'z';
}
Run Code Online (Sandbox Code Playgroud)

此代码给出了编译器错误,

错误:操作数为?:具有不同类型的'X'和'char'

当类型转换操作符没有歧义时,为什么*p不解决?这样的虚假错误消息是正确的还是g ++错误?charclass X

[ 更新注意:有趣的是这种情况不会产生这样的错误 ]

Naw*_*waz 8

它似乎是一个编译器错误.我在规范中检查过,标准清楚地说(§5.16/ 3 - C++ 03),

否则,如果第二个和第三个操作数具有不同的类型,并且具有(可能是cv-qualified)类类型,则尝试将每个操作数转换为另一个操作数的类型.

本节的其余部分解释了转换是如何完成的.使用用户定义的转换运算符,*p无法通过隐式转换为char类型来阻止任何操作.

另外,我编译了它(GCC) 4.5.0.它没有错误,也有-pedantic选项.尝试过-std=c++98-std=c++0x.仍然没有错误.

最明确的是,它是一个编译器错误.

  • 哇... C++有时会让你大吃一惊. (2认同)