[C++]11版本新特性2:左值、右值引用、完美转发

引入

本文接着来介绍cpp11更新的一些新特性
提前说明一下,左值引用和右值引用都是对于对象取别名

左值引用与右值引用

左值引用

我们一般情况下可以对其进行取地址,并且还可以对其进行赋值左值可以出现在等号的左边

给出一段例子

int main()
{
	// 以下的p、b、c、*p都是左值
	int* p = new int(0);
	int b = 1;
	const int c = 2;
	
	// 以下几个是对上面左值的左值引用
	int*& rp = p;
	int& rb = b;
	const int& rc = c;
	int& pvalue = *p;
	return 0;
}

右值引用

右值

  • 右值与左值相同(都是一个数据的表达式)
  • 字面常量、表达式返回值、返回值不是左值引用的函数返回值(临时对象)
  • 右值不能取地址
int main()
{
	double x = 1.1, y = 2.2;
	// 以下几个都是常见的右值
	10; x + y;
	min(x, y);
	// 以下几个都是对右值的右值引用
	int&& rr1 = 10;
	double&& rr2 = x + y;
	double&& rr3 = min(x, y);
	
	// 这里编译会报错:error C2106: “=”: 左操作数必须为左值
	//10 = 1; x + y = 1;
	//min(x, y) = 1;
	return 0;
}

二者比较

  • 语法上的区别就是一个&和两个&
  • 二者都是取别名,不消耗额外空间
  • 左值引用指针存储的是当前左值的地址
  • 右值引用先把右值拷贝到栈上的一个临时空间,然后其指针存储这个临时空间的地址

左值引用

  1. 左值引用只能引用左值
  2. const左值引用可以引用右值

右值引用

  1. 右值引用只能引用右值
  2. 右值引用可以引用move后的左值
int main()
{
	// 右值引用只能右值,不能引用左值。
	int&& r1 = 10;

	// error C2440: “初始化”: 无法从“int”转换为“int &&”
	// message : 无法将左值绑定到右值引用
	//int a = 10;
	//int&& r2 = a;
	
	// 右值引用可以引用move以后的左值
	int&& r3 = std::move(a);
	return 0;
}

右值引用的意义

左值引用的使用场景

一般用作参数和返回值

void func1(bit::string s){}

void func2(const bit::string& s){}

int main()
{
	bit::string s1("hello world");
	// func1和func2的调用我们可以看到左值引用做参数减少了拷贝,提高效率的使用场景和价值
	func1(s1);
	func2(s1);
	// string operator+=(char ch) 传值返回存在深拷贝
	// string& operator+=(char ch) 传左值引用没有拷贝提高了效率
	s1 += '!';
	return 0;
}

短板:
当其返回值为临时对象,出了作用域就不存在了,所以无法用左值引用,这样就会导致至少一次的拷贝构造

右值引用的使用场景

移动构造

我们可以用右值引用和移动语义来解决多出的拷贝构造

我们在类中增加移动构造函数,目的是窃取要拷贝对象的资源,这样就不需要深拷贝了,减少了资源的浪费

	// s1.swap(s2)
	void swap(string& s)
	{
		::swap(_str, s._str);
		::swap(_size, s._size);
		::swap(_capacity, s._capacity);
		//这里的::意思是
		//::swap 意味着调用全局命名空间中的 swap 函数,而不是当前命名空间中的 swap 函数。
	}
	// 移动构造
	string(string&& s)
		:_str(nullptr)
		, _size(0)
		, _capacity(0)
	{
		cout << "string(string&& s) -- 移动语义" << endl;
		swap(s);
	}

补充:当既有拷贝构造又有移动构造时,编译器会自动选择合适的(跟之前的一些知识比较像:只吃自己想吃的好吃的😋)

移动赋值

有移动构造就有移动赋值
就是右值引用版本的operator=

万能引用

经过上面的学习,感觉右值引用很厉害,减少了资源消耗,提高了效率,

值得一提的是:
编译器在早期对于返回值的传递进行了优化,本来是一次拷贝构造+一次移动构造完成返回值的传递,优化后先将返回值move一下,之后再移动构造

但这样会有问题:之前所有传值返回的代码都要加一个move,这就很麻烦了,所以编译器是进行了隐式的move

那有没有更简便的写法呢,这就要结合我们的老朋友:模板

结合模板的引用,使得在引用时,能保留对象的原生属性

也叫通用引用、引用折叠
用&&结合模板使用,
则传入左值就是左值,传入右值就是右值

完美转发

语法形式:

std::forward<T>(t)

可以大概认为编译器做了识别,保持其原来的属性

与move的区别是,move是确定最后是右值,而forward是保持其原生属性

总结

  1. 左值和右值是什么,可不可以修改
  2. 万能引用怎么用
  3. 完美转发和move的区别是什么

下一篇文章将介绍可变参数模板、lambda的相关知识

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S 部署和访问 Kubernetes 仪表板(Dashboard)

文章目录 部署 Dashboard UI浏览器访问登陆系统 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览…

推荐一款国内超级好用的低代码平台+商业开源低代码MES

一、低代码平台是什么&#xff1f; 低代码平台是一种应用程序&#xff0c;它为编程提供图形用户界面&#xff0c;从而以极快的速度开发代码&#xff0c;减少传统编程工作。 这些工具有助于快速开发代码&#xff0c;最大限度地减少手工编码的工作量。这些平台不仅有助于编码&a…

网络通信安全

一、网络通信安全基础 TCP/IP协议简介 TCP/IP体系结构、以太网、Internet地址、端口 TCP/IP协议简介如下&#xff1a;&#xff08;from文心一言&#xff09; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff0…

基础环境:wsl2安装Ubuntu22.04 + miniconda

服务器相关信息&#xff1a; Thinkpad p1 gen5 64G 2T 3080ti&#xff0c;自带的有nvidia-smi显卡驱动。使用wsl2安装Ubuntu22.04 miniconda目标&#xff1a;安装gpu版本的PyTorch2.1.2&#xff08;torch2.1.2/cu117 torchvision0.16.2/cu117&#xff09; 处理器 12th Gen I…

【Linux-进程状态】

文章目录 1.进程状态1.运行状态2.阻塞状态3.挂起 2.Linux系统中的进程状态1.前台进程和后台进程深度睡眠 2.停止状态3.僵尸状态和死亡状态&#xff08;孤儿进程&#xff09; 1.进程状态 想要理解进程状态&#xff0c;我们要先看看课本中的进程有哪些状态。 进程状态用大白话说…

云渲染一张图多少钱

使用云渲染渲染一张效果图的价格没法确定多少钱一张&#xff0c;云渲染一张图的价格会受到多个因素的影响&#xff0c;如云渲染平台的定价策略、所选的渲染配置、优惠政策以及你提交的场景任务等。因此&#xff0c;无法给出确切的单一价格。 不同的云渲染平台会有不同的定价模…

《苍穹外卖》Day11部分知识点记录(数据统计——图像报表)

一、Apache ECharts 介绍 Apache ECharts是一款基于javascript的数据可视化图标库&#xff0c;提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 效果展示 柱形图饼图折线图 入门案例 1. 在 echart…

API安全尽释领先力,美创再获权威市场指南推荐

数字化时代&#xff0c;单位组织愈加依赖API实现系统间的数据共享和交互&#xff0c;但同时&#xff0c;因API引发的网络攻击风险也在不断升级&#xff0c;成为数据泄露的高发之地。 统计显示&#xff0c;过去的一年&#xff0c;API攻击增长已超过287%。Gartner研报预测&#x…

链动3+1模式:引领运营革命的创新之路与优势解析

在数字化浪潮的席卷之下&#xff0c;企业为寻求持续发展&#xff0c;已将商业模式创新视为核心驱动力。其中&#xff0c;链动31模式以其独特的运营理念&#xff0c;成功引领了一场革命性的运营变革&#xff0c;使得众多企业和个人在激烈的市场竞争中崭露头角。接下来&#xff0…

Docker 容器操作

容器创建 就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 格式&#xff1a;docker create [选项] 镜像 常用选项&#xff1a; -i&#xff1a;让容器开启标准输入 -t&#xff1a;让…

RLDRAM简介

说明 RLDRAM&#xff08;Reduced Latency DRAM&#xff0c;减少延迟动态随机访问存储器&#xff09;是一种专为解决延迟问题而设计的DRAM架构&#xff0c;主要由美光和英飞凌公司开发。它的出现主要是为了满足对更低延迟、更高带宽的SRAM市场的需求。 随着技术的不断发展&…

上位机图像处理和嵌入式模块部署(树莓派4b与mcu固件升级)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在一个系统当中&#xff0c;可能不止需要树莓派4b一个设备。有的时候还需要搭载一个mcu&#xff0c;做一些运动控制的事情。比如说&#xff0c;图像…

电脑处于局域网,怎么查询电脑公网IP

当你购买了云服务器&#xff0c;要设置安全组的时候&#xff0c;就是限制能访问你的服务器的网络IP&#xff0c;比如限制只有你的电脑能连接你的服务器 那么一般就是要就要开放服务器的22号端口&#xff0c;端口范围就是你要开放的服务器的端口&#xff0c;如上图所示授权对象就…

【JAVA】探究Java依然屹立的25个理由

1.生态系统成熟 Java 具有广泛的生态系统&#xff0c;我们可以自由选择库、构建工具和框架。 2.一次编写&#xff0c;到处运行 Java 具有跨平台特性&#xff0c;一次编写&#xff0c;到处运行。 3. 向后兼容性 Java 承诺永远向后兼容&#xff0c;非常nice。 4. JAVA强类型…

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者&#xff0c;我长期关注特殊群体的生活现状与科技助力下的改善举措。今天&#xff0c;我要讲述的是盲人朋友在独立出行&#xff0c;尤其是过马路时面临的挑战&#xff0c;以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能&#xff0c;显著提…

vue2[黑马笔记]

vue基础 是什么—javascript框架 构建用户界面的前端框架 1.构建用户界面用vue往html页面中填充数据 2.框架现成的解决方案&#xff0c;遵守框架的规范去实现自己的业务功能学习vue 就是学习vue框架中规定的用法vue的指令组件&#xff08;对ul结构的复用&#xff09;&#x…

袁庭新ES系列16节|Elasticsearch客户端高级操作

前言 上一章节袁老师主要带领大家学习了Elasticsearch客户端基础部分的内容&#xff0c;Elasticsearch客户端还有很多高级相关的操作&#xff0c;这一章节主要带领大家来学习Elasticsearch客户端高级相关的操作。接下来就跟上袁老师的节奏继续探讨Elasticsearch的相关知识。 一…

swiper使用方法?

组件 首先 recat -vant组件 带小点点的 可以实现跳转的一个效果 import { Swiper } from react-vant; 每个 Swiper.Item 代表一张轮播卡片&#xff0c;可以通过 autoplay 属性设置自动轮播的间隔。 import React from react; import { Swiper } from react-vant; import { i…

游戏新手村20:游戏落地页广告页如何设计

在互联网营销中,着陆页(Landing Page,有时被称为首要捕获用户页)就是当潜在用户点击广告或者搜索引擎搜索结果页后显示给用户的网页&#xff0c;LandingPage对于游戏广告的转化率和重要性就不言而喻了。 网页游戏LP页面 上图就是我们大家在浏览网站时不小心蹦出或者主动点击某…
最新文章