c++ -- 左值和右值

总结--C++ primer 5

 

一、左值和右值(P121)

1. 概念

  C++的表达式,要不然是右值,要不然是左值。

  这两个名词继承与C语言,在C中是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能。在C++中,二者的区别没那么简单:当一个对象被用作右值的时候,用的是对象的(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

  一个重要的原则(P470有一个例外):在需要右值的地方可以用左值来代替,但是不能把右值当成左值(也就是位置)使用。当一个左值被当成右值使用时,实际使用的是它的内容(值)。

  要用到左值的运算符

  1. 赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果也仍然是一个左值。

  2. 取地址符(&)作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是一个右值

  3. 返回左值引用的函数、内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是左值

  4. 内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得结果也是左值。

2. 左值持久;右值短暂

  左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象。

二、右值引用(P470)

1. 概念

  为了支持移动操作,新标准引入一种新的引用类型--右值引用。所谓右值引用就是必须绑定到右值的引用。

  重要性质:右值引用只能绑定到一个将要销毁的对象(字面常量/临时对象)。

  由于右值引用只能绑定到临时对象,得:

  1. 所引用的对象将要被销毁

  2. 该对象没有其他用户

  返回右值的表达式,包括:返回非引用类型的函数及算术、关系、位和后置递增/递减运算符。

2. 应用

  对于左值引用,不能将其绑定到要求转换的表达式、字面值常量或是返回右值的表达式。而右值引用可以绑定到这类表达式,但不能将一个右值引用直接绑定到一个左值上。

  返回非引用类型的函数,连同算术、关系、位以及后置递增/递减运算符,都生成右值。我们不能将一个左值引用绑定到这类表达式上,但可以将一个const的左值引用或者一个右值引用绑定到这类表达式。

1 int i=42;                     //i是一个变量,变量是左值       
2 int &r=i;                     //正确:r引用i
3 int &&rr=i;                  //错误:不能将一个右值引用绑定到一个左值上
4 int &r2=i*42;              //错误:i*42是右值
5 const int &r3=i*42;     //正确:可以将一个const 左值引用绑定到一个右值上
6 int &&rr2=i*42;          //正确:将rr2绑定到乘法结果上 

3. 变量是左值

  变量可以看做只有一个运算对象而没有运算符的表达式。变量表达式都是左值则:不能将一个右值引用绑定到一个右值引用类型的变量上。

int &&rr1=42;                //字面常量是右值
int &&rr2=rr1;               //错误:表达式rr1是左值

  变量是持久的,直至离开作用域时才被销毁。

 

转载于:https://www.cnblogs.com/cygalaxy/p/6917634.html

weixin063传染病防控宣传微信小程序系统的设计与实现+springboot后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值