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

Array-to-pointer conversion in VC++

本文关键字:指针 转换 数组 VC++      更新时间:2023-10-16

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

在标准中5.16[expr.cond]的第4段中说:

如果第二个和第三个操作数是相同值类别的glvalues,并且具有相同的类型,则结果是那种类型和价值类别〔…〕

因此,在您的情况下,结果应该是1 int的类型数组的左值。

第5段以"否则,结果为prvalue"开头,这显然与第4段的"If…"相反。

在我的阅读中,第6段也不适用。

对第二个和第三个操作数执行Lvalue到右值(4.1)、数组到指针(4.2)以及函数到指针(4.3)的标准转换。

如果我们已经确定结果是glvalue,那么在从左值到右值的转换之后,我们不可能有一个有效的对象作为结果,所以第6段必须紧跟在第5段开始的"否则…"之后。公平地说,我不认为这是完全明确的,即使我的另一种解读会导致更大的不一致性。

tl;博士:我认为gcc在这种情况下是正确的。

一个解决方法可以是使用:*(true ? &ary1 : &ary2)