在 C++03 中,表达式可以是rvalue or an lvalue.
在 C++11 中,表达式可以是:
- rvalue
- lvalue
- xvalue
- glvalue
- prvalue
两类变成了五类。
- 这些新的表达类别是什么?
- 这些新类别与现有的右值和左值类别有何关系?
- C++0x 中的右值和左值类别与 C++03 中的相同吗?
- 为什么需要这些新类别?是WG21 http://www.open-std.org/jtc1/sc22/wg21/诸神只是想迷惑我们凡人吗?
我想这个文档可以作为一个不那么简短的介绍:n3055 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3055.pdf
整个屠杀是从移动语义开始的。一旦我们有了可以移动但不能复制的表达式,突然之间,易于掌握的规则就要求区分可以移动的表达式以及向哪个方向移动。
根据我对草案的猜测,r/l 值的区别保持不变,只是在移动事物变得混乱的情况下。
他们需要吗?如果我们想放弃新功能,则可能不会。但为了实现更好的优化,我们或许应该拥抱它们。
Quoting n3055 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3055.pdf:
- An lvalue(历史上所谓
因为左值可能出现在
作业的左侧
表达式)指定一个函数或
一个东西。[示例:如果
E
是一个
指针类型的表达式,则*E
是一个左值表达式,指的是
对象或函数E
点。作为另一个例子,
调用函数的结果
返回类型是左值引用
左值。]
- An xvalue(一个
“eXpiring”值)也指
物体,通常接近其末端
生命周期(以便其资源可以
例如,被移动)。 x 值是
某些类型的结果
涉及右值的表达式
参考。[示例:
调用函数的结果
返回类型是右值引用
x 值。]
- A glvalue(“广义”左值)是lvalue
or an xvalue.
- An rvalue(所谓的,
从历史上看,因为右值可以
出现在
赋值表达式)是一个 xvalue,
临时对象或
其子对象,或者是一个值
不与对象关联。
- A
prvalue(“纯”右值)是一个右值
这不是 x 值。[示例:
调用函数的结果
返回类型不是引用而是a
右值]
该文档对于这个问题来说是一个很好的参考,因为它显示了由于引入新术语而导致的标准的确切变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)