一尘不染

什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?

c++

在 C++03 中,表达式是rvaluelvalue

在 C++11 中,表达式可以是:

  1. rvalue
  2. lvalue
  3. xvalue
  4. glvalue
  5. prvalue

两个类别变成了五个类别。

  • 这些新的表达方式是什么?
  • 这些新类别与现有的右值和左值类别有何关系?
  • C0x 中的右值和左值类别是否与 C03 中的相同?
  • 为什么需要这些新类别?WG21 的众神只是想迷惑我们这些凡人吗

阅读 134

收藏
2022-06-09

共1个答案

一尘不染

从我基于草案的猜测来看,r/l 值的区别保持不变,只是在移动事物变得混乱的情况下。

他们需要吗?如果我们希望放弃新功能,可能不会。但是为了实现更好的优化,我们可能应该接受它们。

引用n3055

  • lvalue(所谓的,历史上,因为左值可能出现在赋值表达式的左侧)指定一个函数或一个对象。 [例子:ifE是指针类型的表达式,then\*E 是一个左值表达式,指的是指向的对象或函数E 。再举一个例子,调用返回类型为左值引用的函数的结果是左值。]
  • 一个xvalue(an “eXpiring” value)也指一个对象,通常接近其生命周期的末尾(例如,它的资源可能会被移动)。xvalue 是某些涉及右值引用的表达式的结果。 [示例:调用返回类型为右值引用的函数的结果是 xvalue。]
  • glvalue (“generalized” lvalue)是lvaluexvalue
  • *rvalue*(所谓的,历史上,因为右值可能出现在赋值表达式的右侧)是一个 xvalue,一个临时对象或其子对象,或者一个不与对象关联的值。
  • prvalue(“pure” rvalue)是不是 xvalue 的右值 。 [示例:调用返回类型不是引用的函数的结果是prvalue]

有问题的文件是这个问题的一个很好的参考,因为它显示了由于引入新命名法而发生的标准的确切变化。

2022-06-09