加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:06:45 所属栏目:百科 来源:网络整理
导读:此代码在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
此代码在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,所以它看起来像Foo().x [0]应该是一个左值.但是,当以这种方式访问??时,Foo()的rvalue-ness可能传播到它的所有字段?

还要考虑D行,它适用于所有编译器.我认为bar [n]基本上只是*(bar n)(对于数组)的语法糖,所以D行工作但C行失败似乎很奇怪.

解决方法

Foo().x [0]是C 11中的左值.在C 11中,内置下标运算符的结果总是左值,因为它涉及解除引用指针.

在C 14中,内置下标运算符的行为已更改:

>如果a是左值,那么[i]是左值.
>否则,[i]是xvalue.

Foo()是一个prvalue,因此访问一个非静态成员会产生一个xvalue.由于Foo.x是x值,因此Foo.x [0]也是x值,无法分配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读