临时对象的字段是否为右值?

时间:2017-06-08 23:25:14

标签: c++

此代码在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行失败似乎很奇怪。

0 个答案:

没有答案