左值右值引用,完美转发

1.c++98/03,类模板和函数模板只能含固定数量的模板参数,c++11的新特性可以创建接受可变参数的函数模板和类模板

//Args是一个模板参数包,args是一个函数形参参数包
//声明一个参数包Args… args,这个参数包可以包括0到任意个模板参数
template<class …Args>
void showlist(Args… args)
由于args前面有省略号,它就是一个可变模板参数,把带有省略号的参数称为参数包,它里面包含着0到N个模板参数,我们是无法直接获取参数包args,只能通过展开参数包的方式获取参数包的每个参数,语法不支持args[i]的方式获取可变参数
获取参数包的方式
1.递归函数方式展开函数包

//编译的递归推演
//第一个模板参数依次解析获取参数值
void _showlist() {cout << "没有模板参数" << endl;
}
template<class T>
void _showlist(const T& val) {cout << val << "只有一个模板参数" << " ";
}
template<class T, class ...Args>
void _showlist(const T& val, Args...args) {cout << val << endl;_showlist(args...);
}
template<class ...Args>
void showlist(Args...args) {_showlist(args...);
}
int main() {showlist();showlist(1);showlist(1, 2, 3);showlist(1, "ss", 2.2);
}

在这里插入图片描述
例如我们showlist(“Hello”,666,‘A’,3.1415926);
其中的模板参数包包含类型参数[const char*, int, char, double],函数参数包包含值参数[“Hello”, 666, ‘A’, 3.1415926]
在调用可变参数版本时:
“Hello"被传给形参T,剩余的参数: 666, ‘A’, 3.1415926。 然后,类型参数: int, char, double将被放入模板参数包Args中。值参数: 666, ‘A’, 3.1415926将被放入函数参数包args中。打印value的值"Hello”,开始下一轮递归。666被传给形参T,剩余的参数: ‘A’, 3.1415926。 然后,类型参数: char, double将被放入模板参数包Args中。值参数: ‘A’, 3.1415926将被放入函数参数包args中。打印T的值666,开始下一轮递归’A’被传给形参T,剩余的参数:3.1415926。 然后,类型参数: double将被放入模板参数包Args中。值参数: 3.1415926将被放入函数参数包args中。打印value的值’A’,开始下一轮递归。此时,参数包中只有一个参数,所以将调用只有一个参数版本的Print(), 3.1415926被传给形参arg,打印arg的值3.1415926,结束递归。

要初始化arr,强行让解析参数包,参数包有几个参数,printArg就一次推演生成几个

template<class T>
int  print(T val) {cout << val << " ";return 0;
}
template<class ...Args>
void showlist(Args...args) {int arr[] = {print(args)...};cout << endl;
}
int main() {showlist(1, 2, "1233", 'a');
}

emplace_back

template<class... Args>
void emplace_back(Args&&.. args){
Node*newnode=new Node(args...);
}
template<class... Args>
list_node(Args...args)
:data(args...)//例如,list中为pair,用参数包直接调用pair的构造
,next(nullptr)
,prev(nullptr)
{}

//直接把参数包不断往下传,直接构造到节点中的val上

emplace_back在实现时,则是在容器尾部创建这个元素,省去了拷贝或移动元素的过程
push_back首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中
2.左值和右值
一般认为,可以放在=左边的,或者能够取地址的,称为左值,只能放在等号右边的,或者不能取地址的,称为右值
常见右值 `

 10//字面常量i+j//表达式返回值 fmin(i,j)//函数调用返回值`

c++11对右值进行了区分
①.纯右值 a+b,100
②.将亡值 表达式的中间结果,函数按照值的方式进行返回
左值引用常见场景
①.引用传参 void func(const T&x)
②.引用返回 T&func() 出了函数作用域,对象生命周期还未结束
移动语义的出现
移动语义:将一个对象中的资源移动到另一个对象中的方式

为了避免 构造临时对象,深拷贝进行拷贝构造,再构造的重复流程,使用移动构造,构造临时对象通过移动构造将资源转移到临时对象中,而临时对象本身又是右值(将亡值),构造的时候会将临时对象的资源转移到要构造的对象中

要注意,右值引用本身的属性是左值

   double&& r = 1.1 + 2.2;double& c = r;

完美转发

template<tyname T>
void PerfectForward(T&&t){
Func(forward<T>(t));
}

比如PerfectForward(10),我们想输出右值引用,但由于右值引用的属性是左值

perfectForward为转发的模板函数,Func为实际目标函数,完美转发是目标函数总希望将参数按照传递给转发函数的实际类型转给目标函数,而不产生额外的开销,就好像转发者不存在一样
所谓完美:函数模板在向其它函数传递形参的时候,如果相应实参是左值,它就应该被转发为左值,如果相应实参是右值,它就应该被转发为右值。

#include<bits/stdc++.h>
using namespace std;
void func(int&x){cout<<"左值引用"<<endl;
}
void func(int&&x){cout<<"右值引用"<<endl; 
}
void func(const int &x){cout<<"const 左值引用"<<endl; 
}
void func(const int&&x){cout<<"const 右值引用"<<endl;
}
template<typename T>
void perfectForward(T&&t){func(forward<T>(t));
}
int main(){int c;perfectForward(3);
}

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

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

相关文章

NLP论文阅读记录 - 2022 sota | 校准序列似然改善条件语言生成

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作强化学习方法两阶段重新排名方法具有序列级损失的多任务学习 三.本文方法3.1 相似度函数3.2 校准损失3.3正则化损失3.4 候选解码方法 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.…

ToB还是ToC?工业级与消费级AR眼镜都能干什么?

来源&#xff1a;虹科数字化与AR 虹科分享 | ToB还是ToC&#xff1f;工业级与消费级AR眼镜都能干什么&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/lyTASoKm29woIbfcKBtMvQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 随着科技的飞速发展&#…

智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.冠状病毒群体免疫算法4.…

【Amazon 实验③】Amazon WAF功能增强之追踪 Amazon WAF RequestID,排查误杀原因

文章目录 1. 方案介绍2. 架构图3. 操作演示 本实验将介绍如何利用 Amazon LambdaEdge&#xff0c;在 Amazon CloudFront 自定义错误页面 上展示每个由 Amazon WAF 返回的“403 Forbidden”错误的 Request ID。通过这个唯一的 WAF Request ID&#xff0c;网站运维工程师能够快速…

swing快速入门(二十四)绘画板-可调色

注释很详细&#xff0c;直接上代码 上一篇 Look here~ 听我说完再继续看更容易理解&#xff1a; 如果说用之前的绘图方法写一个绘画板你会怎么做&#xff1f;重绘会让之前的内容消失呀&#xff0c;用各种数据结构记录每个像素点的位置或颜色&#xff1f;嘶&#xff0c;感觉很麻…

HFish蜜罐搭建及简单使用

一、HFish蜜罐 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的…

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上答疑&#x…

Java网络编程---TCP

服务端 import java.io.DataInputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class Server2 {public static void main(String[] args) throws Exception{System.out.println("------------服务端启动---------…

josef约瑟 DB-1电压回路断相闭锁继电器100V 5A 嵌入式安装

DB-1电压回路断相闭锁继电器 1 用途 DB-1型闭锁继电器&#xff0c;是在电压回路发生断路而可能引起继电保护误动作时&#xff0c;用以闭锁继电器。 2 结构和工作原理 DB-1型断相闭锁继电器的原理线路图见图1。 图1 DB-1原理接线图 断相闭锁继电器线路由零序电压过滤器(三个容量…

ubuntu20.04下安装pcl_ubuntu安装pcl

pcl点云数据库&#xff0c;用来进行3D信息的获取与处理&#xff0c;和opencv相比较&#xff0c;opencv是用来处理二维信息&#xff0c;他是学术界与工业界针对点云最全的库&#xff0c;且网络上相关的资料很多。以下是pcl的安装步骤以及遇到的问题。 提前说明&#xff0c;本人…

Shell三剑客:awk(格式化输出)

一、格式符 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 % % 显示%自身 # [.#] 第一个数…

10分钟创建AIGC应用,腾讯云推出高性能应用服务HAI

降低AIGC应用开发门槛&#xff0c;才能更快发现下一个AIGC现象级应用。 12月18日&#xff0c;腾讯云宣布推出高性能应用服务(Hyper Application Inventor&#xff0c;HAI)&#xff0c;用户无需复杂配置&#xff0c;最快10分钟即可创建自己的AI应用。 HAI能够提供即插即用的算…

Vue 的两种实现:VSCode 中配置 vue 模板快捷方式的过程

1、创建配置文件&#xff1a; 其一、打开 VSCode &#xff0c;CtrlShiftP, 打开搜索框&#xff1a; 其二、输入&#xff1a;user, 并点击进去 Snippets:Configure User Snippets 其三、输入 vue3js 并回车&#xff1a; 其四、打开项目&#xff0c;发现配置文件 vue3js.code-sn…

Layui 下拉select多选实现

1. html <div id"mo_deptment"></div> 2.引用 <script src"~/layuiadmin/layui/xm-select.js"></script>3.设置全局变量存储控件 var mo_deptmentSelect; 4.layui.use 中初始化 4.1 列表数据 var mo_deptmentdata [ …

红队打靶练习:DIGITALWORLD.LOCAL: DEVELOPMENT

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录 灰度变换 直方图&#xff08;Histogram&#xff09; 直方图均衡 直方图匹配&#xff08;规定化&#xff09; 空间滤波 低通滤波器 高通滤波器 ​​​​​​​ 本文章讲解数字图像处理空间域图像增强&#xff0c;大部分内容来源于课堂笔记中 灰度变换 图像增强&…

使用Python将OSS文件免费下载到本地:第一步 列举OSS文件

大家好,我是水滴~~ 本文将介绍了使用的知识点、以及列举OSS文件的代码、并对该代码进行详细解析、最后给出部署方案,希望能对你有所帮助! 《Python入门核心技术》专栏总目录・点这里 系列文章 使用Python将OSS文件免费下载到本地:项目分析和准备工作使用Python将OSS文件免…

【网络安全】学习Web安全必须知道的一本书

【文末送书】今天推荐一本网络安全领域优质书籍。 目录 正文实战案例1&#xff1a;使用Docker搭建LAMP环境实战案例2&#xff1a;使用Docker搭建LAMP环境文末送书 正文 学习Web安全离不开Web&#xff0c;那么&#xff0c;需要先来学习网站的搭建。搭建网站是每一个Web安全学习…

为什么SSL证书是必备之物?

SSL证书的首要任务是保障用户和网站之间的数据传输安全。未加密的数据传输容易受到中间人攻击&#xff0c;使敏感信息暴露于风险之中。SSL通过加密数据&#xff0c;有效地抵御了这些潜在的威胁&#xff0c;确保用户的隐私得到充分保护。 采用SSL证书的网站在浏览器地址栏中通常…

如何进行USB丢弃攻击?

USB丢弃攻击&#xff0c;类似于一场表演艺术&#xff0c;您需要构建一个引人入胜的故事&#xff0c;激发目标的好奇心&#xff0c;让他们忽略基本的安全意识&#xff0c;插入您精心准备的USB设备! 本文章仅限娱乐&#xff0c;请勿模仿或进行违法活动&#xff01; 一、选择放置…