C++源码分析完美转发

news2024/10/1 1:22:04

C++源码分析完美转发

  • 完美转发作用:
    • 可以保持实参数据在函数中的左值或者右值类型。

不使用完美转发的后果

  • #include<iostream>
    using namespace std;
    
    // 容器里面元素的类型
    class A
    {
    public:
    	A() {}
    	// 带左值引用参数的赋值函数
    	A& operator=(const A& src)
    	{
    		cout << "operator=&" << endl;
    		return *this;
    	}
    	// 带右值引用参数的赋值函数
    	A& operator=(A&& src)
    	{
    		cout << "operator=(A&&)" << endl;
    		return *this;
    	}
    };
    // 容器的类型
    template<typename _Ty>
    class Vector
    {
    public:
    	// 引用左值的push_back函数
    	void push_back(const _Ty& val)
    	{
    		mvec[mcur++] = val;
    	}
    	// 引用右值的push_back函数
    	void push_back(_Ty&& val)
    	{
    		// 这里传递val时,要用move转换成右值引用类型,
    		mvec[mcur++] = val;
    	}
    private:
    	enum { VEC_SIZE = 10 };
    	_Ty mvec[VEC_SIZE];
    	int mcur;
    };
    
    int main()
    {
    	Vector<A> vec;
    	A a;
    	vec.push_back(a); // 调用A的左值引用的赋值函数
    	vec.push_back(A()); // 理应调用A的右值引用参数的赋值函数,却调用了左值引用的赋值函数
    	return 0;
    }
    

  • 可见,不使用完美转发,vec.push_back(A()); 理应调用A的右值引用参数的赋值函数,却调用了左值引用的赋值函数

    • image-20230519134624798
  • 原因:

    • 因为当传递右值给 push_back(_Ty&& val) 函数时
    • 由于 val右值引用的形参,它在函数内部被解释为左值引用,因此在函数体内部处理时,它仍然被视为左值。
  • 所以避免我们传递的右值引用 失去右值的效果,我们引入了 完美转发

引入完美转发

  • 源码:

    • template<class _Ty>
      	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
      	{	// forward an lvalue as either an lvalue or an rvalue
      	return (static_cast<_Ty&&>(_Arg));
      	}
      
      template<class _Ty>
      	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept
      	{	// forward an rvalue as an rvalue
      	static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
      	return (static_cast<_Ty&&>(_Arg));
      	}
      
  • 源码实现了两个版本的forward重载函数

    • 左值引用版本的

      • 调用场景

        • 不管传入的是左值右值,形参val都是左值,所以调用的都是forward的左值引用版本

        • 	template<class _Ty>
          	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
          	{	// forward an lvalue as either an lvalue or an rvalue
          		cout << "remove_reference_t<_Ty>& _Arg" << endl;
          		return (static_cast<_Ty&&>(_Arg));
          	}
          
          • 如果实参类型是int& + && -> **int&**就保持了实参的左值引用类型
          • 如果实参类型是int&& + && -> **int&&**就保持了实参的右值引用类型。
        • image-20230519135652756

    • 右值引用:

      • 只有传入的参数是 右值时,才会调用

        • template<class _Ty>
          	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept
          	{	// forward an rvalue as an rvalue
          	static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
          	return (static_cast<_Ty&&>(_Arg));
          	}
          
        • image-20230519135747009

总结

  • 利用完美转发,我们可以可以保持实参数据在函数中的左值或者右值类型,从而达到我们想要的效果

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

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

相关文章

24 KVM管理虚拟机-配置VNC-TLS登录

文章目录 24 KVM管理虚拟机-配置VNC-TLS登录24.1 概述24.2 操作步骤 24 KVM管理虚拟机-配置VNC-TLS登录 24.1 概述 VNC服务端和客户端默认采用明文方式进行数据传输&#xff0c;因此通信内容可能被第三方截获。为了提升安全性&#xff0c;openEuler支持VNC服务端配置TLS模式进…

在光伏行业的自动化生产中,EAP起到了什么作用?

随着可再生能源的快速发展和环保意识的增强&#xff0c;光伏行业作为一种清洁能源产业正迅速崛起。光伏生产过程的自动化已成为行业的追求和趋势。在光伏行业的自动化生产中&#xff0c;EAP&#xff08;设备自动化程序&#xff09;系统发挥着关键的作用&#xff0c;为生产线的运…

drawio@绘制带有latex公式的图表@示意图@流程图@白板模式whiteboard

文章目录 drawio绘制带有latex公式的图表示意图流程图白板模式whiteboard使用drawio小结 公式编辑Use mathematical typesetting in diagramsUse mathematical typesetting in diagramsTroubleshooting关于文本框元素公式渲染问题&#x1f388;Maths is not rendered 模式切换d…

【K哥爬虫普法】你很会写爬虫吗?10秒抢票、10秒入狱,了解一下?

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

【TES745D】基于复旦微的FMQL45T900 全国产化ARM 核心模块(100%国产化)方案设计中文资料

板卡概述 TES745D 是一款基于上海复旦微电子FMQL45T900 的全国产化ARM 核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX 的XC7Z045-2FFG900I 兼容&#xff09;的最小系统集成在了一个87*117mm 的 核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩…

主成分分析(PCA)直观理解与数学推导

近期在完成信息论的作业&#xff0c;发现网上的资料大多是直观解释&#xff0c;对其中的数学原理介绍甚少&#xff0c;并且只介绍了向量降维&#xff0c;而没有介绍向量重构的问题&#xff08;重构指的是&#xff1a;根据降维后的低维向量来恢复原始向量&#xff09;&#xff0…

Yolov5轻量化:MobileNetV3,轻量级骨架首选

1.轻量化网络简介 轻量化网络是指在保持模型性能的前提下,尽可能减小模型参数量和计算量的神经网络。这种网络通常被用于在移动设备等资源受限的场景中部署,以提高模型的实时性和运行效率。 轻量化网络的设计思路可以包括以下几个方面: 去除冗余层和参数:通过剪枝、蒸馏等技…

基于RT-Thread的lwip网卡优化笔记

基于RT-Thread的lwip网卡优化笔记 一、RT-Thread的lwip框架二、网卡驱动三、网卡吞吐速率测试四、网卡吞吐速率优化4.1 TCP参数优化4.2 lwip参数优化4.3 内存拷贝优化4.3.1 rt_memcpy优化4.3.2 使用uboot下的memcpy.S 4.4 网卡收发优化4.3.1 lwip发送优化4.4.2 网卡发送优化 一…

MyBatis查询各种类型数据该如何处理才能得到数据

文章目录 1、前言2、查询一个实体类对象字段名和属性名无法映射处理方式一&#xff1a;起别名方式二&#xff1a;使用全局配置文件配置映射规则方式三&#xff1a;自定义resultmap 3、查询一个list集合4、查询单个数据5、查询一条数据为map集合6、 查询多条数据为map集合方式一…

课程分享:华清远见联合NXP推出i.MX8M Plus开发与实践课程,超干超实用!

​课程名称&#xff1a; i.MX8M Plus开发与实践课程 课程介绍&#xff1a; i.MX8M Plus应用处理器是NXP推出的一款致力于推动机器学习&#xff08;ML&#xff09;&#xff0c;机器视觉&#xff0c;多媒体与工业边缘物联网应用的工业人工智能芯片。拥有4个ARM Cortex-A53核心…

远程桌面连接黑屏怎么解决?方法大全

远程桌面连接是一种非常有用的技术&#xff0c;它可以让用户从任何位置远程访问到其它计算机。然而&#xff0c;当你尝试连接到一个计算机时&#xff0c;你有可能会遇到远程桌面连接黑屏的问题。这个问题很常见&#xff0c;但是它可能会给你带来很多麻烦。在本文中&#xff0c;…

ssRender Plugin 基础

ssRender Plugin 基础 一.什么是Plugin ​ 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。其只能运行在程序规定的系统平台下&#xff08;可能同时支持多个平台&#xff09;&#xff0c;而不能脱离指定的平台单独…

Windows安装配置Tomcat服务器教程 -- 外网远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 转载自cpolar文章&#xff1a;外网访问本地Tomcat服务器【cpolar内网穿透】…

【SpringBoot】五:Web服务---SpringMVC---控制器

文章目录 1 控制器介绍2 控制器工作流程3 控制器中的方法4 匹配请求路径到控制器方法5 RequestMapping6 控制器方法参数类型与可用返回值类型7 接收请求参数8 验证参数8.1 Bean Validation8.2 分组校验8.3 ValidationAutoConfiguration 1 控制器介绍 &#xff08;1&#xff09…

【Linux Network】数据链路层

目录 认识以太网 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 认识MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对于TCP协议的影响 MSS和MTU的关系&#xff1a; 查看硬件地址和MTU ARP协议 ARP协议的作用 ARP协议的工作流程 ARP数据报的格式 DNS(Domain Name System) …

近期要做填报报表,使用Spreadsheet还是Finereport?

又是忙碌的五月呀~~近期接到一个项目&#xff0c;是一家商贸公司需要去采集销售部门的销售业绩据&#xff0c; 以往他们使用Excel表格线下去做报表填报&#xff0c;传统的报表体系效率低&#xff0c;文件杂&#xff0c;汇总难。下级部门上传数据需要以多个表格来上报&#xff0…

Python3安装

依赖安装 gcc是一个用于linux系统下编程的编译器&#xff0c;由于python3需要编译安装&#xff0c;因此&#xff0c;需要首先安装gcc。先查看一下系统中&#xff0c;是否安装了gcc。 gcc --versions 发现没有安装&#xff0c;则需要安装。参数-y的作用是在安装过程中自动确认…

在 Python 中制作偶数列表

文章目录 开始什么是偶数在 Python 中使用 for 循环创建偶数列表在 Python 中使用 while 循环制作偶数列表使用列表理解在 Python 中制作偶数列表使用 Lambda 表达式在 Python 中创建偶数列表 开始 我们将通过示例介绍偶数列表以及在 Python 中创建偶数列表的不同方法。 什么是…

今天公司来了个拿 30K 出来的测试,算是见识到了基础的天花板

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

韩国访问学者签证D-2-5材料准备及签证流程

韩国的签证种类很多&#xff0c;对于申请访问学者签证来说&#xff0c;较常见的签证种类是D-2-5签证和E-3签证&#xff0c;本篇知识人网小编先介绍D-2-5签证。 签证的材料准备 根据韩国大使馆2023年4月12日最新发布的“签证申请与准备材料指导”内容, D-2-5签证的签发对象及准…