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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值