VC ++中的数组到指针转换

时间:2013-12-07 16:52:18

标签: c++ visual-c++

此代码无法使用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从未显示此错误。 什么是正确的行为?

1 个答案:

答案 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)代替。