C++11——右值引用

news2024/12/23 14:23:38

在这里插入图片描述

文章目录

    • 1. 左值和右值
      • 1.1 什么是左值
      • 1.2 什么是右值
    • 2. 左值引用和右值引用
      • 2.1 左值引用的使用场景
      • 2.2 右值引用的使用场景
    • 3.移动语义
    • 4. 完美转发

1. 左值和右值

1.1 什么是左值

左值,不能根据名字来判断,即左边的就是左值,这个是错误的。

int a = 10;	//a是左值 10是右值
int b = a;	//b是左值 a也是左值

左值是一个表示数据的表达式,可以对其取地址,一般可以对它进行赋值。左值既可以出现在赋值符号的左边,又可以在赋值符号的右边

对于const修饰的左值,不能给它赋值,但是可以取地址

1.2 什么是右值

右值也是一个数据的表达式,如:字面常量、表达式返回值等。右值不能出现在赋值符号的左边,且右值不能进行取地址

int Sub(int x, int y)
{
	return x - y;
}

int main()
{
	int a = 10;
	int b = a;
	
	//右值
	10;		
	a + b;	
	Sub(a, b);
	return 0;
}

2. 左值引用和右值引用

在语法上来说,引用就是取别名。那么左值引用就是给左值取别名;右值引用就是给右值取别名

void t1()
{
	int a = 1;
	//左值引用
	int& r1 = a;	//给左值取别名
	const int& r2 = 10;	//加上const修饰,给右值取别名

	//右值引用
	int&& r3 = 10;	//给右值取别名
	int&& r4 = std::move(a);	//加上move给左值取别名
}

2.1 左值引用的使用场景

左值引用可以做参数、做返回值,这样可以减少拷贝。

但是对于局部对象的返回,左值引用无法处理。

string& func()
{
	string str("hello");

	return str;	//函数结束str销毁了
}
int main()
{
	string s = func();
	cout << s << endl;
	return 0;
}

那这样就只能传值返回,如果对象比较大,那么这样的代价就比较大

image-20231016115524410

2.2 右值引用的使用场景

对于内置类型的右值,我们通常称为纯右值;对于自定义类型的右值,我们称为将亡值

而上面的func()就是一个将亡值,那么我们就可以采用移动拷贝,直接拿到这个将亡值的资源

mystring::string func()
{
	mystring::string str("hello");

	return str;	//函数退出时,str销毁
}

int main()
{
	mystring::string s1 = func();
	cout << endl;
	mystring::string s2;
	s2 = func();
	return 0;
}

image-20231016122506759

这里的func()中的返回值str被编译器(C++每个编译器都这样)识别成了右值,如果不这样,那么就得加上move(str),才能匹配重载的右值引用版本,这样就得修改大部分的代码,C++11的性能就难以直接提升;所以直接识别成右值,就能直接匹配上。

例如下面这段代码

vector<vector<int>> func()
{
	vector<vector<int>> vv;
	//...
	//
	//...
	return vv;
}

编译器直接将vv识别成了右值,就极大的减少了拷贝,提升了性能。

3.移动语义

当一个右值引用一个左值时,可以通过move函数将左值转换成右值

move1

这里s1move处理之后,被识别成了右值,然后会调用移动构造,将资源转移给了s3

4. 完美转发

模板中的&&叫做万能引用

如果实参是左值,那么就是左值引用(引用折叠)

如果实参是右值,那么就是右值引用

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; }

template<typename T>
void PerfectForward(T&& t)
{
	Fun(t);
}

int main()
{
	PerfectForward(10);           // 右值
	int a;
	PerfectForward(a);            // 左值
	PerfectForward(std::move(a)); // 右值
	const int b = 8;
	PerfectForward(b);      // const 左值
	PerfectForward(std::move(b)); // const 右值
	return 0;
}

这里运行发现,竟然全部都是左值引用

image-20231016144851832

右值,是不能修改的;而右值引用,是可以修改的,而右值引用的本质又是左值

void t2()
{
	//10是右值
	int&& ra = 10;
	//ra是右值引用,本质上是开了一块空间将10的值存起来
	
	//10++;	//error
	//cout << &10 << endl;	//error
	ra++;
	cout << &ra << endl;
}

所以上面代码的t右值引用变量的属性识别成了左值,从而导致全部调用的左值引用函数

如果不识别出左值属性,那么在移动构造的场景下,就不能修改,无法进行资源转移

想要其保持原有的属性,即左值引用保持左值属性,右值引用保持右值属性。我们可以使用forward函数让其保持原有属性

image-20231016150340477
t右值引用变量的属性识别成了左值,从而导致全部调用的左值引用函数

如果不识别出左值属性,那么在移动构造的场景下,就不能修改,无法进行资源转移

想要其保持原有的属性,即左值引用保持左值属性,右值引用保持右值属性。我们可以使用forward函数让其保持原有属性。


那么本次的分享就到这里,我们下期再见,如果还有下期的话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统使用AndroidStudio创建桌面快捷键

Linux系统使用AndroidStudio创建桌面快捷键 系统&#xff1a;deepin 20.7 Android studio 版本&#xff1a;Android Studio Iguana | 2023.2.1 Canary 1 下载免安装最新版本后&#xff0c;是直接在安装包中启动的&#xff0c;但是有点麻烦&#xff0c;就需要设置一个桌面快捷菜…

数据分析案例-基于snownlp模型的MatePad11产品用户评论情感分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

禁用和开启笔记本电脑的键盘功能,最快的方式

笔记本键盘通常较小&#xff0c;按键很不方便&#xff0c;当我们外接了键盘时就不需要再使用自带的键盘了&#xff0c;而且午睡的时候&#xff0c;总是担心碰到笔记本的键盘&#xff0c;可能会删掉我们的代码什么的&#xff0c;所以就想着怎么禁用掉&#xff0c;下面是操作步骤…

消失的人!消除视频中不需要的人物

视频拍摄中拍摄了不相干或者是不需要出现的人物&#xff0c;想要从视频中去除&#xff0c;应该如何操作呢&#xff1f;有什么快捷方法可以轻松扣除视频中的人物&#xff1f; 我们在视频剪辑的时候都有这样的烦恼吧&#xff1f;就是在一段视频素材里有多余的人物出现&#xff0…

女性用品经营商城小程序的作用是什么

女性悦己消费增强&#xff0c;围绕女性产生的商品&#xff0c;品牌多且样式足&#xff0c;消费者可以随时购买到&#xff0c;但随着线上互联网深入人们生活&#xff0c;电商近些年发展迅速&#xff0c;传统女性用品线下经销商或品牌在实际经营中面临着痛点。 线上卖货是各商家…

大数据 DataX 详细安装教程

目录 一、环境准备 二、安装部署 2.1 二进制安装 2.2 python 3 支持 三、Data X 初体验 3.1 配置示例 3.1.1. 生成配置模板 3.1.2 创建配置文件 3.1.3 运行 DataX 3.1.4 结果显示 3.2 动态传参 3.2.1. 动态传参的介绍 3.2.2. 动态传参的案例 3.3 迸发设置 …

快速学会Typora和Markdowm常用语法

什么是Markdown&#xff1f; Markdown 是一种轻量标记语言&#xff0c;和 Word、PDF、HMTL 格式一样&#xff0c;可以用作文章或者网页的格式。 和其它的格式相比&#xff0c;Markdown 具备以下优势&#xff1a; 易学易用&#xff0c;逼格满满&#xff1b; 格式简洁&#xff…

常用的原型工具有哪些?推荐这7款

原型图设计工具有很多优点。除了帮助设计师快速与客户达成协议&#xff0c;避免项目前景的冲突外&#xff0c;原型图设计工具还可以让客户看到正在创建的内容。如果需要更改&#xff0c;原型图设计工具也可以轻松完成。本文快速总结了7种原型图设计工具。无论你是专业设计师还是…

行情分析——加密货币市场大盘走势(10.16)

目前大饼再次止稳&#xff0c;并开始向上攀升&#xff0c;目前MACD来看也是进入了多头趋势。重新调整了蓝色上涨趋势线&#xff0c;目前来看这次的低点并没有跌破上一个低点&#xff0c;可以认为是上涨的中继。注意白天的下跌回调。 以太目前也是走了四连阳线&#xff0c;而MAC…

网络安全—小白自学笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

你知道跨境商城源码如何为商家节省成本和时间吗

跨境电商行业迅速发展&#xff0c;商家如何利用跨境商城源码实现成本和时间节省 在全球经济一体化的背景下&#xff0c;跨境电商行业蓬勃发展&#xff0c;为商家提供了全球范围的市场机会。然而&#xff0c;面临的挑战也日益增多&#xff0c;比如高昂的运营成本和繁琐的流程&am…

嵌入式面试经典30问

嵌入式面试经典30问 很多同学说很害怕面试&#xff0c;看见面试官会露怯&#xff0c;怕自己的知识体系不完整&#xff0c;怕面试官考的问题回答不上了&#xff0c;所以今天为大家准备了嵌入式工程师面试经常遇到的30个经典问题&#xff0c;希望可以帮助大家提前准备&#xff0…

weapp-tailwindcss for uni-app 样式条件编译语法插件

weapp-tailwindcss for uni-app 样式条件编译语法插件 版本需求 2.10.0 weapp-tailwindcss for uni-app 样式条件编译语法插件 这是什么玩意?如何使用 tailwind.config.js 注册postcss 插件注册 uni-app vite vue3uni-app vue2 配置完成 配置项 这是什么玩意? 在 uni-app …

GeoServer源码运行(数据目录+数据库)

1、源码下载 下载地址:https://github.com/geoserver/geoserver/tree/2.23.2 图 2选择版本下载 2、启动配置 图 3主程序启动类配置 GeoServer主程序的启动类为web->app[gs-web-app]模块下test目录下“org.geoserve

3个g的文件怎么发送给别人?三种方法自由选择!

发送大文件不仅会耗费较长时间&#xff0c;同时也可能需要消耗更多的流量费用&#xff0c;更容易出现网络中断或其他传输错误。这时候就需要使用文件压缩工具将它们压缩为一个文件&#xff0c;然后将其发送到收件人。下面介绍了三种大体积压缩的方法&#xff0c;一起来看看吧&a…

探索未来:硬件架构之路

文章目录 &#x1f31f; 硬件架构&#x1f34a; 基本概念&#x1f34a; 设计原则&#x1f34a; 应用场景&#x1f34a; 结论 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

微信小程序里配置less

介绍 在微信小程序里&#xff0c;样式文件的后缀名都是wxss&#xff0c;这导致一个问题&#xff0c;就是页面样式过多的时候&#xff0c;要写很多的类名来包裹&#xff0c;加大了工作量&#xff0c;还很有可能会写错样式。这时可以配置一个less&#xff0c;会大大提高代码编辑…

Programming abstractions in C阅读笔记:p179-p180

《Programming Abstractions In C》学习第60天&#xff0c;p179-p180总结。 一、技术总结 1.palindrome(回文) (1)包含单个字符的字符串(如"a")&#xff0c;或者空字符串(如" ")也是回文。 (2)示例&#xff1a;“level”、“noon”。 2.predicate fun…

优维产品使用最佳实践:实例拓扑

背 景 实例拓扑可以帮助我们直观地了解整个系统的架构和组成情况&#xff0c;该拓扑图是通过已有的实例的关联关系自动生成&#xff0c;当实例数据和关系变化时拓扑图也能实时更新&#xff0c;我们可以快速直观的查看当前实例下所有资源的之间的网状关系和资源数量。 实例拓扑…