C++标准库功能:Xvalue,prvalue和Lvalue

学习cpp11之后,对左值和右值的分类。
在这里插入图片描述
先看一个简单的分类:
在这里插入图片描述
更加详细的分类。这里我把Xvalue(ex)翻译成将亡值吧,直观好理解。Prvalue(pure right value)是纯右值。
1.有引用,不将亡  2.有引用,将亡 3.没有引用,将亡

glvalue(泛左值) = lvalue (传统意义上的左值)+ xvalue(消亡值,通过右值引用产生)
rvalue (传统意义上的右值) = prvalue(纯右值) + xvalue

在这里插入图片描述

一个例子 在这里插入图片描述

在这里插入图片描述
在这里,prvalue()函数得到一个纯右值,因为没有赋值到其他变量,没有实体,可以被移动。
lvaue()函数是一个左值,因为有引用指向他,有实体,不可以被移动。
xvalue()是定义得右值,有实体,可以被移动。

总结

  1. 简单的来说,能取地址的变量一定是左值,有名字的变量也一定是左值,最经典的void fun(p&& shit),其中shit也是左值,因为右值引用是左值(所以才会有move,forward这些函数的产生,其中move出来一定是右值,forward保持变量形式和之前的不变,就是为了解决右值引用是左值的问题)。

  2. 至于为什么不能把等号左边看成左值,因为在C++中,等号是可以运算符重载的,等号完全可以重载成为等号左边为右值的形式。

  3. 纯右值是传统右值的一部分,纯右值是表达式产生的中间值,不能取地址。

  4. 本质上,消亡值就是通过右值引用产生的值。右值一定会在表达式结束后被销毁,比如return x(x被copy以后会被销毁), 1+2(3这个中间值会被销毁)。

参考资料

  1. https://www.cnblogs.com/Philip-Tell-Truth/p/6370019.html?utm_source=itdadao&utm_medium=referral
  2. https://en.cppreference.com/w/cpp/language/value_category
发布了46 篇原创文章 · 获赞 0 · 访问量 816

猜你喜欢

转载自blog.csdn.net/github_38148039/article/details/104138763