当我使用数组文字时,我在不同的编译器上看到了奇怪的行为。
我遇到的第一个问题是我有这样的程序:
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 ++的错误。
哪种编译器是对的?
答案 0 :(得分:4)
Clang是对的。在[expr.type.conv] / 3之后构造数组对象是格式良好的,我们没有采用数组对象的地址(如GCC所说)但是让数组到指针发生衰减,这是允许的数组无论值类别如何:
“N T数组”或“未知数组的数组”的左值或右值 T“可以转换为”指向T“的prvalue类型。结果 是指向数组第一个元素的指针。