此代码在Clang 3.8,GCC 6.3和VS2013下成功编译,但在Clang 4.0下失败:
struct Foo {
int x[2];
Foo() {
x[0] = 3; // line A: works fine - we can assign to x[0]
*&x[0] = 4; // line B: works fine - we can take the address of x[0]
}
};
int main() {
Foo().x[0] = 5; // line C: error: expression is not assignable
*(Foo().x + 0) = 6; // line D: works fine
}
哪个编译器正确? Foo().x[0]
是左值还是左值?
A行和B行适用于所有编译器,x[0]
肯定是左值,而行A和B肯定引用与行C相同的x
,所以看起来像{{ 1}}应该是左值。但是,当以这种方式访问时,Foo().x[0]
的rvalue-ness可能传播到它的所有字段?
还要考虑D行,它适用于所有编译器。我认为Foo()
基本上只是bar[n]
(对于数组)的语法糖,所以D行工作但C行失败似乎很奇怪。