当我使用数组文字时,我在不同的编译器上看到了奇怪的行为。
我面临的第一个问题是当我有这样的程序时:
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。结果是指向数组的第一个元素的指针。