什么是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)。这可以避免复制并高效地移动资源。