在 C++03 中,表达式可以是右值,也可以是左值。
在 C++11 中,表达式可以是:
- 右值
- 左值
- x值
- gl值
- 右值
两个类别变成了五个类别。
- 这些新的表达类别是什么?
- 这些新类别与现有的右值和左值类别有何关系?
- C++0x 中的右值和左值类别与 C++03 中的相同吗?
- 为什么需要这些新类别?是WG21众神只是想迷惑我们凡人?
最佳答案
我想这个文档可以作为一个不那么简短的介绍:n3055
整个屠杀是从移动语义开始的。一旦我们有了可以移动而不可以复制的表达式,突然之间,易于掌握的规则就需要区分可以移动的表达式以及向哪个方向移动。
根据我对草案的猜测,r/l 值的区别保持不变,只是在移动事物变得困惑的情况下。
他们需要吗?如果我们想放弃新功能,则可能不会。但为了实现更好的优化,我们可能应该拥抱它们。
引用n3055 :
- 左值(所谓的,历史上,
因为左值可能出现在
作业的左侧
表达式)指定一个函数或
一个东西。 [示例:如果
E
是 指针类型的表达式,然后*E
是一个左值表达式,指的是E
的对象或函数 点。作为另一个例子, 调用函数的结果 返回类型是左值引用 左值。] - xvalue(一个 “即将到期”值)也指 物体,通常接近其末端 生命周期(以便其资源可以 例如,被移动)。 x 值是 某些类型的结果 涉及右值的表达式 引用。 [示例: 调用函数的结果 返回类型是右值引用 x 值。]
- glvalue(“广义”左值)是一个左值 或xvalue。
- 右值(所谓的, 从历史上看,因为右值可以 出现在 赋值表达式)是一个 xvalue, 临时对象或 其子对象,或者是一个值 不与对象关联。
- A prvalue(“纯”右值)是一个右值 这不是 x 值。 [示例: 调用函数的结果 返回类型不是引用而是a 右值]
所讨论的文档对于这个问题来说是一个很好的引用,因为它显示了由于引入新术语而导致的标准的确切变化。
关于c++ - 什么是右值、左值、x值、左值和右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61899123/