任意一个表达式的值类别是以下三种之一:左值(lvalue)、将亡值(xvalue)、纯右值(prvalue)
其中左值和将亡值并称为广义左值(glvalue)。
将亡值和纯右值并称为右值(rvalue)。
| 左值 | 纯右值 | 将亡值 | |
|---|---|---|---|
| 有标识符 | 有 | 无 | 有 |
| 可移动 | 否 | 是 | 是 |
| 可取地址 | 是 | 否 | ? |
| 可放在运算符的左侧 | 是 | 否 | 否 |
| 例子 | 变量、函数的名字 | lambda表达式 | |
| 例子 | 左值对象的成员 | 右值对象或数组的成员 | |
| 例子 | 返回类型为T&的表达式 | 返回类型为T的表达式 | 返回类型为T&&的表达式 |
| 例子 | ++x,x=1,cout<<" " |
x++,1+1 |
std::move(x) |
| 例子 | 字符串字面量,例如“hello world” | 除字符串字面量以外的字面量,例如:true, 5 | |
| 用法 | 可以绑定到左值 | 可以绑定到const左值引用,优先绑定到右值引用 | 优先绑定到右值引用 |