学习cpp11之后,对左值和右值的分类。
先看一个简单的分类:
更加详细的分类。这里我把Xvalue(ex)翻译成将亡值吧,直观好理解。Prvalue(pure right value)是纯右值。
glvalue(泛左值) = lvalue (传统意义上的左值)+ xvalue(消亡值,通过右值引用产生)
rvalue (传统意义上的右值) = prvalue(纯右值) + xvalue
一个例子 
在这里,prvalue()函数得到一个纯右值,因为没有赋值到其他变量,没有实体,可以被移动。
lvaue()函数是一个左值,因为有引用指向他,有实体,不可以被移动。
xvalue()是定义得右值,有实体,可以被移动。
总结
-
简单的来说,能取地址的变量一定是左值,有名字的变量也一定是左值,最经典的void fun(p&& shit),其中shit也是左值,因为右值引用是左值(所以才会有move,forward这些函数的产生,其中move出来一定是右值,forward保持变量形式和之前的不变,就是为了解决右值引用是左值的问题)。
-
至于为什么不能把等号左边看成左值,因为在C++中,等号是可以运算符重载的,等号完全可以重载成为等号左边为右值的形式。
-
纯右值是传统右值的一部分,纯右值是表达式产生的中间值,不能取地址。
-
本质上,消亡值就是通过右值引用产生的值。右值一定会在表达式结束后被销毁,比如return x(x被copy以后会被销毁), 1+2(3这个中间值会被销毁)。
参考资料
- https://www.cnblogs.com/Philip-Tell-Truth/p/6370019.html?utm_source=itdadao&utm_medium=referral
- https://en.cppreference.com/w/cpp/language/value_category