此代码无法使用VC ++ 2012进行编译。
struct Test
{
int ary1[1];
int ary2[1];
void func() {
int (&ref)[1] = ( true ? ary1 : ary2 );
}
};
int main() {}
编译器说:
error C2440: 'initializing' : cannot convert from 'int *' to 'int (&)[1]'
三元运算符进行数组到指针的转换。
但是,GCC从未显示此错误。 什么是正确的行为?
答案 0 :(得分:2)
在标准中5.16 [expr.cond]的第4段中说:
如果第二个和第三个操作数是相同值类别的glvalues并且具有相同的类型,则结果 属于该类型和价值类别[...]
因此,结果应该是在您的情况下键入1 int
数组的左值。
第5段以“否则,结果是prvalue”开头,这显然是第4段“If ......”的另一种情况。
在我的阅读中,第6段也不适用。
对第二个和第三个操作数执行左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换。
如果我们确定结果是glvalue,那么在左值到左值的转换之后我们就没有办法将有效对象用作结果,因此第6段必须继第5段开始的“否则......”之后。公平地说,即使我的另一种读法会导致更大的不一致,我也不认为这是完全明确的。
tl;博士:我认为gcc在这种情况下是正确的。
解决方法可能是使用:*(true ? &ary1 : &ary2)
代替。