数组文字语法怪癖

时间:2014-10-18 16:24:33

标签: c++ c++11

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

我遇到的第一个问题是我有这样的程序:

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++中,它会产生不同的错误。

1 个答案:

答案 0 :(得分:4)

Clang是对的。在[expr.type.conv] / 3之后构造数组对象是格式良好的,我们没有采用数组对象的地址(如GCC所说)但是让数组到指针发生衰减,这是允许的数组无论值类别如何:

  

“N T数组”或“未知数组的数组”的左值或右值   T“可以转换为”指向T“的prvalue类型。结果   是指向数组第一个元素的指针。