当前位置: 首页 > news >正文

c++11右值引发的概念

右值引用

右值&&左值

c++11增加了一个新的类型,右值引用,记作:&&

左值是指在内存中有明确的地址,我们可以找到这块地址的数据(可取地址)

右值是只提供数据,无法找到地址(不可取地址)

所有有名字的变量都是左值,而右值是匿名的。

一般情况下位于等号左边的是左值,位于等号右边的是右值,但是也可以出现左值给左值赋值的情况

c++11中右值分为两种情况:一个是将亡值,一个是纯右值.

将亡值:与右值引用相关的表达式,比如:T&&类型函数的返回值,std::move()的返回值等

纯右值:非引用返回的临时变量,运算表达式产生的临时变量,原始字变量,lambda表达式等

右值引用:

右值引用就是对右值引用的类型。因为右值是匿名的,所以我们只能通过引用的方式找到它。无论是左值引用还是右值引用都必须被初始化,因为引用类型本身并不拥有所绑定对象的内存,只是该对象的一个别名。通过右值引用,该右值所占的内存又可以被使用。

右值引用的用处

在c++用对象初始化对象时会调用拷贝构造,如果这个对象占用堆内存很大,那么这个拷贝的代价就算是非常大的,在某些情况,如果想避免对象的深拷贝,就可以使用右值引用进行性能的优化。

右值引用具有移动语义,移动语义可以将堆区资源,通过浅拷贝从一个对象转移到另一个对象这样就能减少不必要的临时对象创建,拷贝以及销毁,大幅度提高性能

结论:需要动态申请大量的资源的类,应该设计移动构造,提高程序的效率,需要注意的是在提供移动构造的同时,一般也会提供左值引用拷贝构造函数,左值初始化新对象时会走拷贝构造

右值引用的特点:

c++中,并不是所有情况下&&都代表右值引用,在模板和自动类型推导(auto)中,如果是模板参数需要指定为T&&,如果是自动类型推导需要指定为auto&&,这两种情况下&&被称作未定的引用类型。另外constT&&表示一个右值引用,不是未定引用类型。因为T&&或者auto&&这种未定引用类型作为参数时,有可能被推导成右值引用,也有能被推导为左值引用,在进行类型推导时右值引用会发生变化,这种变化被称为引用折叠,折叠规则如下:

通过右值 推导T&&或者auto&&得到的是一个右值引用类型,constT&&表示一个右值引用

通过非右值(右值引用,左值,左值引用,常量右值引用,常量左值引用)推导T&&或者auto&&得到的是一个左值引用类型

move

c++11添加了右值引用,却不能左值初始化右值引用,在一特定的情况下免不了需要左值初始化右值引用(用左值调用移动构造),如果想要用左值初始化一个右值引用需要借助std::move()函数。move()函数可以将左值比换为右值

forward

右值引用类型是独立于值的,一个右值引用作为函数参数的形参时,在函数内部转发该产生给内部其他函数时,他就变成了一个左值(当右值被命名时编译器会认为他是个左值),并不是原来的类型了。如果按照参数原来的类型转发到另一个函数,可以使用c++11的std::forward()函数,该函数实现的功能称之为完美转发

http://www.lryc.cn/news/35864.html

相关文章:

  • MySQL 02 :三层结构、备份删除数据库
  • 质量员错题合集
  • 请教大神们,pmp考试和复习有什么攻略诀窍吗?
  • Go语言基础之接口
  • 【Go自学第一节】GoLang 数据类型
  • 学习ForkJoin
  • System has not been booted with systemd as init system (PID 1). Can‘t operate.
  • 使用Endnote自定义参考文献格式
  • jsPlumb Components Crack
  • Java接口
  • 二叉树OJ题目详解
  • #Vue3篇:响应式工具ref()、toRef()、 toRefs()、reactive()的用法和区别
  • docker容器内安装gcc(trunk 最新版本)以及LLVM
  • 手把手教你如何做数据报表
  • loadrunner的函数lr_paramarr()学习
  • Hive---数据导出
  • 还不会CAD批量打印图纸?学会这招再也不怕
  • 硬件设计从失败案例中找方法
  • 使用python求PLS-DA的方差贡献率
  • 前端面试题--JavaScript篇
  • 【批处理脚本】-3.5-pause暂停命令详解
  • 软件测试11
  • 2023 面试题js、es6篇
  • (六十六)设计索引的时候,我们一般要考虑哪些因素呢?(下)
  • python程序设计基础 实验四
  • ASP.NET CORE API 使用Orleans
  • 《论文阅读》软化标签(将one-hot编码转变为grayscale标签)
  • keras图片数字识别入门AI机器学习
  • 使用qt编写一个程序,伪造一个ip访问一个网站。
  • 探访人工智能领跑者:纷享销客携手30+TOP高科技企业走进旷视科技