Avatar ·

什么是C++中的rvalue、lvalue、xvalue、glvalue和prvalue?

C++11 及更新版本中的基本值类别

您说得对:在 C++11 中,由于移动语义的出现,分类变得更加复杂。原来只有两个类别(左值/右值),现在变成了五个。以下是简要说明:

  • lvalue(左值,定位值)——指具有名称和内存地址的表达式。示例:变量 x、数组 arr[0]、引用 int&。
  • prvalue(纯右值)——指没有名称且无法取地址的表达式。包括临时对象、字面量(字符串字面量除外)、算术运算的结果。示例:5、x + 5、std::string("hello")。
  • xvalue(将亡值)——指引用资源可被移动的对象的表达式。是 std::move() 的结果或返回右值引用的函数调用。示例:std::move(x) 就是 xvalue。
  • glvalue(泛左值)——左值和将亡值的并集。所有具有身份(地址)的表达式。
  • rvalue(右值)——纯右值和将亡值的并集。可被移动的表达式。

在您的示例中:std::move(x) 是 xvalue,因为它明确指示可以移动对象 x。它不是左值,因为没有稳定的名称(移动后 x 的状态可能改变)。它也不是纯右值,因为它引用的是现有对象。

与移动语义的关系:移动语义使用右值引用(int&&)来捕获临时或“即将消亡”的对象(xvalue 和 prvalue)。这可以避免复制并高效地移动资源。