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]是左值. Foo()是一个prvalue,因此访问一个非静态成员会产生一个xvalue.由于Foo.x是x值,因此Foo.x [0]也是x值,无法分配. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |