cpp值类别

内容简介

值类别用于描述表达式的性质,例如它是否有稳定身份、能否被移动、能否绑定到某种引用。理解值类别是理解右值引用、移动语义和完美转发的前提。

基础阶段先掌握两个直觉:

  • 左值:有名字、可取地址、能反复使用的对象。
  • 右值:临时结果,通常可以被移动。

常见例子

int x = 10;      // x 是左值
int y = x + 1;   // x + 1 是右值
std::string make_name();
 
std::string a = make_name();  // make_name() 的结果是临时对象

和引用的关系

int x = 10;
 
int& r1 = x;        // 左值引用绑定左值
const int& r2 = 10; // const 左值引用可以绑定临时对象
int&& r3 = 10;      // 右值引用绑定右值

易错点

int&& r = 10;
// r 本身有名字,所以表达式 r 是左值

这也是完美转发里需要 std::forward 的原因。

注意事项

  • 不要一开始死背 glvalue、prvalue、xvalue 的完整分类。
  • 先理解“能不能被安全移动”和“引用能不能绑定”。
  • 当你学习 移动语义完美转发 时,再回来看完整值类别。

相关:右值引用移动语义完美转发