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