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