在C++03中,表达式可以是右值或左值
在C++11中,表达式可以是:
- r值
- 左值
- xvalue
- glvalue
- prvalue
两类变成了五类
- 这些新的表达方式是什么
- 这些新类别与现有的右值和左值类别有何关联
- C++0x中的右值和左值类别与C++03中的相同吗
- 为什么需要这些新类别?WG21神只是想迷惑我们这些凡人吗
我想这个文档可以作为一个不那么简短的介绍:n3055
整个屠杀都是从这一举动开始的。一旦我们有了可以移动而不能复制的表达式,突然间,容易掌握的规则要求区分可以移动的表达式和移动的方向
根据草稿,我猜r/l值的区别保持不变,只是在移动的东西变得混乱的情况下
需要它们吗?如果我们想放弃新功能,可能不会。但为了实现更好的优化,我们可能应该接受它们
引用n3055:
- 左值(历史上所谓的,
因为左值可能会出现在
作业的左边
表达式)指定函数或
物体[示例:如果E是
指针类型的表达式,然后是*E
是指的左值表达式
E
另一个例子是
调用其
返回类型是一个左值引用
左值。] - 一个xvalue(一个
“到期”值)也指
对象,通常在其
生命周期(以便其资源
例如,被移动)。xvalue是
某些类型的错误的结果
涉及右值的表达式
参考资料[示例:
调用其
返回类型是一个右值引用
一个X值。] - glvalue(“广义”左值)是一个左值
或xvalue - 一个右值(所谓,
历史上,因为右值可以
显示在屏幕的右侧
赋值表达式)是一个xvalue,
临时物品或临时物品
其子对象,或
不与对象关联- A
prvalue(“纯”右值)是右值
这不是一个xvalue[示例:
调用其
返回类型不是一个引用,而是一个
prvalue] - A
该文件是该问题的重要参考资料,因为它显示了新术语引入后标准发生的确切变化