C++11_右值引用
文章目录
- 前言
- 一、右值引用是什么?
- 那么,什么又是右值?
- 右值引用
- 二、使用步骤和意义
- 1.
- 1.1
- 1.2
- 2.右值引用的最大意义
- 2.1 完美转发
- 2.2 万能折叠
前言
C++11 是2011年对C++这门语言发布的新标准,并且此次标准引入了十分多的新特性,很大程度上优化且增加了C++语言的实用性,本章主要讲 C++11 新引用的右值引用。
一、右值引用是什么?
在从C语言进入到C++时,我们就已经开始接触到引用
int i = 0;
int& ir = i;
引用,在我们以往的理解就是给一个变量取别名,实际上我们也确实可以这么理解。
那么,什么又是右值?
这里就需要区分左值和右值的概念,这里就需要注意,许多刚接触到C++的初学者,可能只是片面的认为 在"=“左边的就是左值, 在”="右边的就是右值,而这种区分方式是严重错误的。
int i = 0;
const int i1 = 2;
那我们可以理解为具有常性不可更改的就是右值,可更改的就是左值吗? 也不行
其实区分左值还是右值很简单,就看它是否可以被取地址,可以被取地址的就是左值,不可以被取地址的就是右值。
int i = 0; 左值
const char c; 左值
double* d; 左值
string str; 左值
int& ii = i; 左值
以上都可以被取地址,所以都是左值
1; 右值
sizeof(int); sizeof(int)的返回值为右值
(x+y); 运算符的本质其实也是调用函数所以也是右值
int(1); 匿名对象也是右值
以上就是常见的右值
右值引用
左值引用 是 int& ii = i;
而C++新增加的右值引用是专门对于右值进行引用,使用&&
int a = 1, b = 2;
int&& i = 10;
int&& i1 = a+b;
int&& i2 = sizeof(a);
二、使用步骤和意义
1.
右值引用和左值引用其实都用共同的目的,那就是为了减少拷贝,在我们曾经模拟实现的string和vector中,我们为了减少拷贝,总是会去使用左值引用。
string代码如下(示例):
void Swap(string& str)
{::swap(_str, str._str);::swap(_size, str._size);::swap(_capacity, str._capacity);
}
string(const string& str) //拷贝构造:_str(nullptr), _capacity(0),_size(0)
{string tmp(str._str);Swap(tmp);
}
1.1
那么是不是左值引用就只能引用左值?
string(const string& str) //拷贝构造:_str(nullptr), _capacity(0),_size(0)
{string tmp(str._str);Swap(tmp);
}string str = string("hello world");
这里我们采用匿名对象来构造一个string,刚刚我们也说了,匿名对象也是右值,但是仍然可以走上面的拷贝构造,因为我们使用了const string& str,加了"const"这就使得我们的左值引用也可以引用右值。
而我们的右值引用是不可以引用左值的,大家可以自行尝试,编译器是会报错的。
1.2
综上述,既然我们的const 左值引用也可以去引用右值,那么右值引用的意义是不是就不大了?
2.右值引用的最大意义
我们先来看刚刚的示例代码
代码如下(示例):
string(const string& str) //拷贝构造:_str(nullptr), _capacity(0),_size(0)
{string tmp(str._str); //这里发生了拷贝Swap(tmp);
}
即使我们采用左值引用,这里仍然会发生一次拷贝,而在某些容器例如vector下,拷贝的代价可能会十分巨大,而面对一些将亡值,拷贝的意义并不大,因为有更好的方式! 这个时候,右值引用就凸显出了它的作用!
string(string&& str):_str(nullptr), _capacity(0), _size(0){Swap(str);}
因为在这种情况下,这里的str一定是一个右值中的将亡值,它的生命周期仅仅只是为了构造新的string,所以我们完全可以将其数据用过Swap掠夺过来,再让他自行析构,这就减少了一次拷贝,提高了程序的运行效率!
2.1 完美转发
关于右值引用还需要注意的是一旦使用了右值引用,那么就会改变其原有属性
int a = 1, b = 2;
int&& i = 10;
int&& i1 = a+b;
int&& i2 = sizeof(a);
就例如该上 这里的i,i1,i2都会因为右值引用改变右值属性,变为左值属性,并且你可以对它们的内存数据进行修改,这是因为这些右值数据被移动到了一个其他区域储存起来。
而C++11为了保持其原有的属性,提供了完美转发。
std::forward(x);
void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }
void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }
// std::forward<T>(t)在传参的过程中保持了t的原生类型属性。
template<typename T> //万能折叠
void PerfectForward(T&& t)
{Fun(std::forward<T>(t));//完美转发
}
2.2 万能折叠
template<typename T> //万能折叠
void PerfectForward(T&& t)
{Fun(std::forward<T>(t));
}
通过这样的模版格式,来使得t做一个自动折叠的功能,如果传的是一个左值,那么就是用左值引用,如果是一个右值,就是右值引用。
相关文章:
C++11_右值引用
文章目录 前言一、右值引用是什么?那么,什么又是右值?右值引用 二、使用步骤和意义1.1.11.2 2.右值引用的最大意义2.1 完美转发2.2 万能折叠 前言 C11 是2011年对C这门语言发布的新标准,并且此次标准引入了十分多的新特性&#x…...
C#使用条件语句判断用户登录身份
目录 一、示例 二、生成 利用条件语句判断用户登录身份,根据用户登录身份的不同,给予相应的操作权限。 一、示例 主要用if语句及ComboBox控件。其中,ComboBox是窗体中的下拉列表控件,在使用ComboBox控件前,可以先向…...
在VM下使用Composer完成快照方式的软件制作
Composer允许您构建软件、应用程序、偏好设置文件或是文档的安装包,安装包可以部署到远程电脑或是作为镜像流程的一部分。构建软件包的第一步就是创建包源,根据要打包的软件,Composer允许您监视软件的安装和使用驱动器上已存在的文件来创建包…...
YOLOv5改进 | Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
一、本文介绍 本文给大家带来的改进机制是Damo-YOLO的RepGFPN(重参数化泛化特征金字塔网络),利用其优化YOLOv5的Neck部分,可以在不影响计算量的同时大幅度涨点(亲测在小目标和大目标检测的数据集上效果均表现良好涨点幅度超级高!)。RepGFPN不同于以往提出的改进模块,其…...
设计模式——最全梳理,最好理解
新年献礼! 设计模式呕心梳理 创建型模式 单例模式(Singleton Pattern)https://blog.csdn.net/qq_34869143/article/details/134874044 整理中... 结构型模式 代理模式(Proxy Pattern)https://blog.csdn.net/qq_34…...
外包干了4个月,技术退步明显了...
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四…...
rust 注释文档生成 cargo doc
rust的cargo文档生成 只需要在每个函数写清楚注释,就可以自动生成文档,很方便 即不用写文档,又可以快速查看,是开发rust的必备技能 rust安装和开发环境配置,可以参考:链接 1.写注释的方法 连续三个 \ 即…...
大语言模型(LLM)框架及微调 (Fine Tuning)
大语言模型(LLM) 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统,专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法,…...
速盾高防ip:专业防御ddos
速盾高防IP是速盾网络为企业提供的专业DDoS攻击防御解决方案之一。作为一种先进的网络安全服务,速盾高防IP致力于保护客户的网络资源免受分布式拒绝服务(DDoS)攻击的威胁。以下是速盾高防IP的一些关键特点和优势: 实时攻击监测&am…...
第5章-第8节-Java面向对象中的内部类
1、内部类:属于类的成员之一,类的内部又定义类,外层的class称为外部类,内部的class称为内部类。 设计了某个类,根据需求发现其内部又需要定义一个独立的内部结构,此时就考虑将其定义为内部类,内…...
首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法
Bert-vits2项目又更新了,更新了一个新的分支:中文特化,所谓中文特化,即针对中文音色的特殊优化版本,纯中文底模效果百尺竿头更进一步,同时首次引入了大模型,使用国产IDEA-CCNL/Erlangshen-Megat…...
从零学Java - 接口
Java 接口 文章目录 Java 接口1.接口的语法1.1 与抽象类的区别 2.如何使用接口?2.1 接口的使用规范 3.什么是接口?3.1 常见关系 4.接口的多态性5.面向接口编程5.1 接口回调 6.特殊接口6.1 常量接口6.2 标记接口 7.接口的好处 补充面向对象 七大设计原则 1.接口的语法 接口&a…...
安全防御之身份鉴别技术
身份认证技术用于在计算机网络中确认操作者的身份。在计算机网络世界中,用户的身份信息是用一组特定的数据来表示的,计算机也只能识别用户的数字身份。身份认证技术能够作为系统安全的第一道防线,主要用于确认网络用户的身份,防止…...
axios post YII2无法接收post参数问题解决
axios post YII2无法接收post参数问题解决 在yii 配置文件中增加 ‘parsers’ > [“application/json” > “yii\web\JsonParser”] 如下所示: $config [id > basic,language > zh-CN,timeZone > env(TIME_ZONE, PRC),basePath > $basePath,bo…...
性能优化-OpenMP基础教程(三)
本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 &…...
[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件: 电量 库伦&…...
VSCode配置C/C++环境
文章目录 1. 安装配置 C 编译器1.1 下载 MinGW1.2 Mingw添加到系统变量1.3 验证 2. 安装和配置VSCode2.1 安装VSCode2.2 VSCode配置C环境2.3. 优化 3.参考文章 本文主要记录在VSCode中配置C环境,非常感谢参考文章中的博主。 1. 安装配置 C 编译器 首先需要安装 C 编…...
ChatGPT绘制全球植被类型分布图、生物量图、土壤概念图、处理遥感数据并绘图、病毒、植物、动物细胞结构图
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
vmware workstation的三种网络模式通俗理解
一、前言 workstations想必很多童鞋都在用,经常会用来在本机创建不同的虚拟机来做各种测试,那么对于它支持的网络模式,在不同的测试场景下应该用哪种网络模式,你需要做下了解,以便可以愉快的继续测(搬&…...
C++程序设计兼谈对象模型(侯捷)笔记
C程序设计兼谈对象模型(侯捷) 这是C面向对象程序设计的续集笔记,仅供个人学习使用。如有侵权,请联系删除。 主要内容:涉及到模板中的类模板、函数模板、成员模板以及模板模板参数,后面包含对象模型中虚函数调用&…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
