[C++] 万能引用+引用折叠+完美转发

文章目录

  • 万能引用/通用引用(universal reference)
  • 引用折叠
  • 完美转发(std::forward)

万能引用/通用引用(universal reference)

C++11增加了右值的概念,在模板中,可以用&&来表示右值引用,也可以用&&来表示万能引用。
1.如果重载了模板函数,一个参数是左值引用,一个参数是右值引用,那传入左值或者右值时会自动推导调用的函数模板。
2.如果只有一个模板函数,参数的写法是右值引用,此时传入左值或者右值都会调用这个模板函数。
因为这里的&&代表的是万能引用。

引用折叠

万能引用的实现原理是引用折叠,即模板函数的参数是 T&&,T的类型可以是int&或者int&&,T展开就是int& &&,或者int&& &&,此时发生引用折叠,左值引用还是折叠成左值,右值引用还是右值引用。

完美转发(std::forward)

不论函数的形参是左值引用还是右值引用,在传入函数后,在函数中再传入一个函数时,参数会丢失左值右值信息,在新的函数中会被视为左值。
为了保护参数的左值或者右值属性,就有了完美转发(std::forward<>())。

它的实现原理大概是:

Tempalte <typename T>
std::forward(typename std::remove_reference<T>::type& arg)
{static_cast<T&&>(t);
}
#include <iostream>using namespace std;#define _STD_FORWARD_USED_template <typename T>
void Print(T& t)
{cout << "Print param is lr." << endl;
}template <typename T>
void Print(T&& t)
{cout << "Print param is rr." << endl;
}template <typename T>
void Test_Func(T&& t) 
{
//当模板的参数出现&&时,他可能是右值引用,也可能是万能引用。cout << "Test_Func" << endl;
#if defined(_STD_FORWARD_USED_)Print(std::forward<T>(t)); //当使用std::forward<>()时,形参t保留了左值或者右值的属性。//因为保留了参数的初始属性,这就是[完美转发]。
#elsePrint(t); //当不使用std::forward<>()时,形参t被转换成了左值。
#endif
}int GetIntNum()
{return 1;
}
int main()
{int i = 9;int &li = i;int&& ri = GetIntNum();Test_Func(i);Test_Func(li);//这里有参数折叠,我们传入的是ing&,即T是int&,//此时实参列表式 int & &&,参数折叠为左值引用:int&。Test_Func(GetIntNum());//这里有参数折叠,我们传入的是右值,即T是右值引用int&&,//此时实参列表式 int && &&,参数折叠为右值引用:int&&。
}

输出结果:

->Not defined _STD_FORWARD_USED_* Test_Func* Print param is lr.* Test_Func* Print param is lr.* Test_Func* Print param is lr. ->defined _STD_FORWARD_USED_* Test_Func* Print param is lr.* Test_Func* Print param is lr.* Test_Func* Print param is rr.-->在defined _STD_FORWARD_USED_的基础上,注释void Print(T& t),仅保留void Print(T&& t)也是可以的。-->因为仅用&&函数时,&&就从右值引用,变成了万能引用。

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

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

相关文章

【个人账号体系设计】偏个人功能类账号功能模块设计

本文讨论了针对以个人功能为主的业务系统的账号能力设计&#xff0c;包括账号管理的总体需求、关键属性和设计要点。重点在于如何通过细致的设计实现账号的有效管理和安全性&#xff0c;确保系统既便于用户操作又能维持管理的严密性。 文章目录 需求能力模块设计 需求能力 在进…

python 继承类之细节抽象类之实例化做子类属性

设计者&#xff1a;ISDF工软未来 版本&#xff1a;v4.0 日期&#xff1a;2024/3/7当子类细节过多时&#xff0c;可以再抽象一个类&#xff0c;并将类的实例作为子例的属性&#xff0c;这样子类可以通过.某类.方法去执行class Car:用户类def __init__(self,make,model,year):#类…

嵌入式学习35-网络通信UDP聊天及TCP

题目&#xff1a;基于UDP实现直播间聊天的功能 需求&#xff1a; 软件划分为用户客户端和主播服务端两个软件client.c和server.c 用户客户端负责&#xff1a; 1.接收用户的昵称 2.接收用户输入的信息&#xff0c;能够将信息发送给服务端 3.接收服…

轻量脚本语言Lua的配置与c++调用

文章目录 lua配置下载运行lua命令lua脚本的执行C++调用lua环境配置错误和警告测试c++程序lua脚本结果Lua是一种功能强大且快速的编程语言,易于学习和使用,并且可以嵌入到应用程序中。 Lua被设计成一种轻量级的可嵌入脚本语言。它被用于各种各样的应用程序,从游戏到web应用程…

计算机考研❗️这些院校(含985)性价比巨高

✅厦门大学 (985) 不歧视双非&#xff0c;全靠实力&#xff0c;校园环境还贼美 ✅重庆大学 (985) 信息公开透明&#xff0c;复试抽签 ✅北京师范大学 (985) 不歧视本科出身&#xff0c;面试抽签答题。 ✅东南大学 (985) 保护第一志愿&#xff0c;复试抽签 ✅吉林大学 (…

安捷伦DSA90254A示波器 AgilentDSA90254A

产品简介&#xff1a; •高性能实验室 •2.5 GHz 带宽 •4 个模拟通道&#xff0c;每个通道的采样率为 20 GSa/s •每个通道的数据速率为 20 Mpts 至 1 Gpts •很低的本底噪声&#xff1a;100 mV/格时为 3.01 mVrms •DSA90000A 系列示波器是以 Infiniium DSO90000A 系列…

ChatGPT:人工智能的革命与未来

引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为OpenAI推出的一款语言模型&#xff0c;已经引起了广泛的关注和讨论。它不仅改变了我们与机器交流的方式&#xff0c;还为众多行业的发展带来了革命性的影响。本文将深入探讨ChatGPT的技术原理、应用场景以及它对未来的…

JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)

接上次博客&#xff1a;JavaEE进阶&#xff08;13&#xff09;案例综合练习——博客系统-CSDN博客 目录 程序配置文件修改和打包 构建项目并打包 分平台配置 数据准备 上传jar包到云服务器并运行 开放端口号 验证程序 如何查看日志得到报错信息 常见问题 关于Linux基…

C++ STL——string容器

1&#xff0c;string基本概念 string是C风格的字符串&#xff0c;而string本质上是一个类 string类内部封装了很多成员方法 例如&#xff1a;查找find&#xff0c;拷贝copy&#xff0c;删除delete&#xff0c;替换replace&#xff0c;插入insert string管理char*所分配的内…

串的匹配算法——KMP算法

目录 一.特点 二.算法思想 三.公式证明 四.next数组及其练习 五.找规律计算next[k] 六.代码实现 一.特点 BF算法的特点是i回退&#xff0c;KMP算法的最大特点是i不回退&#xff0c;由于i不回退&#xff0c;所以KMP算法的时间复杂度是O(nm)。 二.算法思想 在匹配主串和子…

浅谈社会工程学攻击

一、前言 1.1 社会工程学起源 社会工程学是黑客米特尼克在《欺骗的艺术》中所提出&#xff0c;其初始目的是让全球的网民们能够懂得网络安全&#xff0c;提高警惕&#xff0c;防止没必要的个人损失。但在我国黑客集体中还在不断使用其手段欺骗无知网民制造违法行为&#xff0c;…

String类,StringBuilder类,StringBuffer类

前言 String类&#xff0c;StringBuilder类&#xff0c;StringBuffer类都是java提供的定义字符串的类&#xff0c;下面是三种字符串类的异同介绍 String类&#xff1a;String类表示的字符串是是常量&#xff0c;一旦创建内容和长度都无法修改 StringBuilder类&#xff1a;St…

6个维度分析实时渲染和Webgl技术异同

在日常交流中&#xff0c;对Webgl技术熟悉的合作伙伴&#xff0c;在初次了解实时渲染技术时&#xff0c;都会问二者之间的异同。目前很多要求B/S架构的项目&#xff0c;很多在用webgl技术路线&#xff0c;而且这个方案在行业里比较普&#xff0c;业主方对这个也比较熟悉&#x…

JAVA实现图像取模

JAVA对图像取模 就是图片变成点阵 原图 取模效果图 代码如下&#xff1a; public static void main(String[] args) throws IOException {try {// 读取图像文件BufferedImage image ImageIO.read(new File("C:/Users/xiaol/Desktop/img/0.jpg"));// 定义阈值&am…

冬去春来天气阴晴不定 美食拿捏味蕾安稳换季

俗话说“春打六九头”&#xff0c;3月虽然已经入春&#xff0c;但是天气依然是凉飕飕的 &#xff0c;冬天春天的换季期&#xff0c;因为天气的变化&#xff0c;尤为痛苦。但是来到了换季期&#xff0c;天气也不总是那么稳定&#xff0c;随着气温的起伏&#xff0c;我们的食欲也…

Vue项目实战--空间论坛(1)

环境准备 安装好node.js,Vue后 添加插件 router---路由&#xff0c;多页面的应用 vuex---在多个组件之间维护同一个数据 添加依赖 bootstrap---美工 popperjs/core vue项目介绍 views-----对应vue文件&#xff0c;页面 router-----路由&#xff0c;页面&#xff0c;c…

《javascript高级程序设计》学习笔记 | 23.JSON

关注[前端小讴]&#xff0c;阅读更多原创技术文章 JSON JSON 是 JS 对象简谱&#xff0c;是一种通用的数据格式和 JS 有相同的语法&#xff0c;但不属于 JS&#xff0c;很多语言都能解析和序列化 JSON 相关代码 → 语法 JSON 支持 3 种类型的值 简单值&#xff1a;字符串、…

leetCode刷题 4.寻找两个正序数组的中位数

目录 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目&#xff1a; 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&…

1分钟带你搞定Python函数分类

python语言中&#xff0c;函数可以分为内置函数、自定义函数、有参数函数、无参数函数、有名字函数和匿名函数。其中&#xff0c;内置函数可以直接使用&#xff0c;自定义函数需要根据需求定义。有参数函数在定义时需要指定参数&#xff0c;调用时传入参数。无参数函数在定义时…

python基础 — 进制转换

1、进制引导符号 在 Python 中&#xff0c;可以使用不同的前缀&#xff08;引导符号&#xff09;来表示不同的进制。 以下是各种进制的引导符号&#xff1a; 二进制&#xff08;Binary&#xff09;&#xff1a;使用0b或0B作为前缀。例如&#xff1a;0b1010 表示二进制数 101…