数组文字语法怪癖

Array literal syntax quirks

本文关键字:语法 文字 数组      更新时间:2023-10-16

当我使用数组文字时,我在不同的编译器上看到了奇怪的行为。

我面临的第一个问题是当我有这样的程序时:

void f(int*)
{
}
int main()
{
    using T = int[];
    f(T{1, 2, 3});
}

在Clang 3.5上,这编译得很好,但在g++4.9上,它给出了错误:

source_file.cpp: In function ‘int main()’:
source_file.cpp:8:17: error: taking address of temporary array
     f(T{1, 2, 3});

在VC++中,它给出错误:

Process exit code is not 0: 255

所以这很奇怪。

如果我让T等于int[3]而不是int[],它在VC++上会编译得很好,但在g++上仍然会出现同样的错误。

此外,如果我将代码更改为:

using T = int[];
int* x = T{1, 2, 3};

则clang给出类似于g++的错误。

哪个编译器是对的?


通过使f的参数为int (&&)[3],我找到了如何使它在g++上工作,但在VC++中,它给出了不同的错误。

Clang是对的。构造数组对象是在[expr.type.conv]/3之后形成的,我们不采用数组对象的地址(正如GCC所说),而是让数组到指针衰减,这对于数组来说是允许的,无论值类别:

类型为"NT数组"或"未知界数组"的左值或右值of T"可以转换为"pointer to T"类型的prvalue。结果是指向数组的第一个元素的指针。