c++之左值和右值

1,左值和右值
定义:左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),换句话说,就是表示内存中可以寻址,可以给它赋值(const类型的变量例外);右值指的则是只能出现在等号右边的变量(或表达式),表示可以知道它的值(例如常数)。变量地址可读可写的是左值,只可读的是右值。

注意:在 c 语言中,通常来说有名字的变量就是左值,而由运算操作(加减乘除,函数调用返回值等)所产生的中间结果(没有名字)就是右值。在 c++ 中,每一个表达式都会产生一个左值,或者右值,相应的,该表达式也就被称作“左值表达式", “右值表达式”。对于基本数据类型来说(primitive types),左值右值的概念和 c 没有太多不同,不同的地方在于自定义的类型,而且这种不同比较容易让人混淆:

  1. 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修饰(cv-qualitification ignored)
  2. 对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。(c++特有的)
    3)右值不能当成左值使用(但左值可以当成右值使用)。另外值得注意的是,对于前面提到的右值的两个特性:
    (1) 右值允许调用成员函数。
    (2) 右值只能被 const reference 指向。
    (3) 右值不能当成左值使用,但左值可以当成右值使用
    总结:
    左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象
    右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。

纯右值:***非引用返回的临时变量( int func(void) )***、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等。
将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值。

int i = 9;	//有一个内存 取个名字叫做i, 存了9
int& r1 = i;	//左值引用:r1是i的别名
int&& r = std::move(i);	//右值引用: 直接使用9,std::move() 函数,把左值转成右值
const cs& ref = get_cs(); //右值只能被 const 类型的 reference 所指向

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值