在C++中,左值(lvalue)和右值(rvalue)是表达式值的重要分类,它们主要与表达式在内存中的位置以及是否可以被赋值或取地址有关。
左值(lvalue)
-
定义:左值是一个持久的、具有确定内存地址的表达式。通常,这意味着左值可以被赋值或取地址。
-
例子:变量、数组元素、结构体成员、引用等都是左值。
int x = 10; // x 是左值
x = 20; // 左值可以被赋值
int* p = &x; // 左值可以取地址
右值(rvalue)
-
定义:右值是一个临时的、没有确定内存地址(或不需要确定内存地址)的表达式。通常,右值表示一个将死的值,即它的生命周期仅限于当前表达式求值期间。在C++11及以后的版本中,右值进一步被细分为纯右值(prvalue)和将亡值(xvalue)。
-
纯右值(prvalue):包括字面量、表达式的结果(如果它们不是引用)以及不调用任何成员函数的临时对象。
int y = 10 + 20; // 10 + 20 是纯右值
const int& z = 10 + 20; // 错误:不能绑定纯右值到非const引用
-
将亡值(xvalue):包括即将被移动的对象(即调用了移动构造函数或移动赋值运算符的对象)。
std::string str1 = "Hello"; std::string str2 = std::move(str1); // str1 是将亡值
右值引用(rvalue reference)
C++11引入了右值引用的概念(使用
&&
表示),它允许程序员直接操作右值,特别是为了优化资源管理和性能。右值引用通常与移动语义(move semantics)和完美转发(perfect forwarding)一起使用。总结
- 左值通常与变量和持久数据关联。
- 右值通常与临时数据和表达式的结果关联。
- 右值引用提供了一种操作右值并优化资源管理和性能的方式。