关于不同类别表达式的举例,请参考博文《C++ 中的值类别》
1. 左值和右值的简单理解
- 左值对应了具有内存地址的对象,而右值仅仅是临时使用的值对象。(引用自博文《C++ 中的值类别》)
- 左值有名称(变量或常量名称),右值是临时对象没有名称
2. lvalue
: locator-value
快速判断标准:每次调用此表达式,值所在的地址都一样。
Note
[Arthur O’Dwyer]:
So anything with a name is always an lvalue, regardless.
所以无论如何,任何有名字的对象总是左值。
13.3 rvalue
:右值
右值举例:
- Literals(字面量)ep.
42
13.3.1 右值的特点
- 无法建立普通引用:因为右值没有合法的固定地址
13.3.2 prvalue: pure right-value
纯右值:prvalue
Cppreference: prvalue examles
prvalue
被绑定到引用上时,其生命周期会延长
这里我们参考了博文《现代C++之万能引用、完美转发、引用折叠(万字长文)》中的描述:
[有生命周期延长的情况]:
如果一个 prvalue 被绑定到一个引用上,它的生命周期则会延长到跟这个引用变量一样长。
13.4 Xvalue:亡值
13.5 Xvalue与prvalue的区别
它们的主要区别在于,xvalue表示的对象是可以被移动的,其资源可以被转移到另一个对象中,而prvalue则不能。
13.6 String literal is an lvalue; other literals are rvalues.
C++标准中明确说明了:字符串立即数会被视为左值,而其它立即数则视为右值。
13.7 Rvalue-reference
对于局部变量,std::move产生的右值变量和原始变量共享相同地址
示例:Cpp_var_rref