C++11 左值、右值、右值引用详解
C++11 左值、右值、右值引用详解
左值、右值
在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。 在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。
右值、将亡值
在理解C++11的右值前,先看看C++98中右值的概念:C++98中右值是纯右值,纯右值指的是临时变量值、不跟对象关联的字面量值。临时变量指的是非引用返回的函数返回值、表达式等,例如函数int func()的返回值,表达式a+b;不跟对象关联的字面量值,例如true,2,”C”等。
C++11对C++98中的右值进行了扩充。在C++11中右值又分为纯右值(prvalue,Pure Rvalue)和将亡值(xvalue,eXpiring Value)。其中纯右值的概念等同于我们在C++98标准中右值的概念,指的是临时变量和不跟对象关联的字面量值;将亡值则是C++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(移为他用),比如返回右值引用T&&的函数返回值、std::move的返回值,或者转换为T&&的类型转换函数的返回值。
将亡值可以理解为通过“盗取”其他变量内存空间的方式获取到的值。在确保其他变量不再被使用、或即将被销毁时,通过“盗取”的方式可以避免内存空间的释放和分配,能够延长变量值的生命期。
左值引用、右值引用
左值引用就是对一个左值进行引用的类型。右值引用就是对一个右值进行引用的类型,事实上,由于右值通常不具有名字,我们也只能通过引用的方式找到它的存在。
右值引用和左值引用都是属于引用类型。无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。左值引用是具名变量值的别名,而右值引用则是不具名(匿名)变量的别名。
左值引用通常也不能绑定到右值,但常量左值引用是个“万能”的引用类型。它可以接受非常量左值、常量左值、右值对其进行初始化。不过常量左值所引用的右值在它的“余生”中只能是只读的。相对地,非常量左值只能接受非常量左值对其进行初始化。
int &a = 2; # 左值引用绑定到右值,编译失败
int b = 2; # 非常量左值
const int &c = b; # 常量左值引用绑定到非常量左值,编译通过
const int d = 2; # 常量左值
const int &e = c; # 常量左值引用绑定到常量左值,编译通过
const int &b =2; # 常量左值引用绑定到右值,编程通过
右值值引用通常不能绑定到任何的左值,要想绑定一个左值到右值引用,通常需要std::move()将左值强制转换为右值,例如:
int a;
int &&r1 = c; # 编译失败
int &&r2 = std::move(a); # 编译通过
转载于:https://www.cnblogs.com/INnoVationv2/p/8437951.html
C++11 左值、右值、右值引用详解相关推荐
- 【Wi-Fi 802.11协议】管理帧 之 Beacon帧详解
Beacon帧简介 信标帧,由AP以一定的时间间隔周期性发出,以此来告诉外界自己无线网络的存在. Beacon帧组成 下图为Beacon帧的组成 下图为抓包所得(AP为2.4g 11n模式),Pack ...
- 左值引用——右值引用 详解
顾明思议 左值引用 就是对左值的引用 就是给左值取别名 右值引用 就是对右值的引用 就是给右值取别名 当改变别名是 该值也相应的改变 那么 何以区分哪些是左值哪些是右值呢? 左值 右值 在内存中有特定 ...
- 小白学python之整型,布尔值,十进制二进制转换和字符串详解for循环!
整型与字符串转化 十进制转二进制. python2,存在int 整型和long(长整型),在python3里就是int/获取的是浮点数 小数 print(bin(15)) 这样可以通过代码来计算十进制 ...
- SQL语句的内连接,外连接,左连接,右连接,全连接详解例子
SQL语句的内连接,外连接,左连接,右连接,全连接详解例子 1.关系:链接分为内连接,外连接:外连接又分为左连接.右连接和全连接 分别为 内连接:(Inner Join):参与表格以JOIN关键词连在 ...
- oracle数据库中索值,Oracle数据库中的索引详解
Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...
- 前端学习笔记(11)之过渡属性(transition)详解
有四个transition属性可以影响过渡效果 指定要执行过渡的属性 transition-property: 过渡效果持续的时间 transition-duration: 过渡的时序函数 trans ...
- Django基础(11): 表单集合Formset的高级用法详解
Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息.今天小编我就介绍下Djang ...
- 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解
传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...
- java中random方法取值范围_java的Random类详解
Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...
最新文章
- ASP.NET Performance Monitoring, and When to Alert Administrators
- 对AI领域的会议的评点
- 最大似然估计和最大后验概率
- 多文档版的的正则表达式工具
- mysql截取字符串中的部分内容_Mysql字符串截取及获取指定字符串中的数据
- PHP,如何防止同一用户同一时间多次登录
- 后来,我再没被任何建筑类考试难倒过
- Jmeter吞吐量控制器详解
- 《Python编程从入门到实践》记录之列表切片
- python我想对你说_python学习22天----模块、包
- 怎么一步步编写简单的PHP的Framework(十九)
- 泰迪杯数据分析比赛2018年B题解答
- EasyConnect下载-百度云盘
- Access数据库使用DateAdd函数更新日期信息
- php在线售卡系统,云尚在线发卡系统PHP源码|专门为个人或小型企业提供在线售卡,订单处理系统...
- Flutter 2.10 开发Windows桌面应用快速入门
- 分布式系统技术难题--异地多活
- OpenLDAP配置坎坷路
- 力扣6. Z 字形变换
- python列表里含有字典的排序
热门文章
- 图书管理系统之管理员普通用户信息管理(五)
- BP爆破工具总结四种模式(详细)
- 弘博创新8周年庆活动-共载风雨同舟路,今朝再谱新篇章!
- 通过一个很实用的例子让你学会T-SQL编程的基本语法和思想
- 7-11 计算银行存款的本息 (5 分)
- zynq中mgtx应用_[ZYNQ入门宝典]GTX高速口带着IBERT一起玩(二)
- Linux-01-配置克隆机
- COCOS2-X 切换场景动画类
- 模型泛化能力(泛化误差+泛化误差上界)| 15mins 入门 | 《统计学习方法》学习笔记(六)
- C语言文件知识——fopen创建文件并输入内容