c++ std::forward 笔记

请您查看如下代码块,这样方便复制过去直接运行
int x = 5;
q_forward w1(x); // 使用左值构造
q_forward w2(10); // 使用右值构造
w2.wrapper_func();

/*** std::forward<>()     向前的,前进的;*  通常与模板和右值引用(rvalue references)一起使用,以便完美转发(perfect forwarding)函数参数。*      完美转发是指将参数精确地传递给另一个函数,不改变参数的左值或右值属性。** todo forward 保持原来的值属性不变:*  如果原来的值是左值,经std::forward处理后该值还是左值。如果外面传来了左值,它就转发左值并且启用copy,同时它也还能保留const。*  如果原来的值是右值,经std::forward处理后它还是右值。如果外面传来了右值临时变量,它就转发右值并且启用move语义** 为什么需要 std::forward?*      在模板编程中,当我们希望将参数从一个函数传递给另一个函数时,通常会遇到如何保留参数类型(左值或右值)的问题。*      直接传递参数可能会导致不必要的拷贝或移动操作,从而影响性能。std::forward可以确保参数的值类别(value category)正确传递,从而避免这些不必要的开销。** 使用场景?*      构造函数和工厂函数:当你希望在构造对象时,将参数精确地传递给另一个构造函数。*      包装函数:当你编写一个包装函数,想要将参数传递给另一个内部调用的函数,并希望保持参数的值类别不变。*      通用模板函数:当你编写一个通用模板函数,并希望将所有参数转发给另一个函数时。*/
class q_forward {
public://构造函数测试//构造函数接受一个通用参数,并使用std::forward将参数完美转发给data成员的构造函数。这样可以确保无论传入的是左值还是右值,都能正确地构造对象。//int x = 5;//Widget w1(x);       // 使用左值构造//Widget w2(10);      // 使用右值构造template<typename T>q_forward(T&& arg) : data(std::forward<T>(arg)) {XLOG_INFO("Constructor data: {0}", data);}q_forward() {}//todo 左值和右值的函数 视为重载void process(int& i) {XLOG_INFO("Lvalue reference i: {0}", i);}void process(int&& i) {XLOG_INFO("Rvalue reference i: {0}", i);}//函数接受一个通用的参数类型T&&(万能引用),并通过std::forward将其转发给process函数。// 如果传递的是左值引用,std::forward会保留它的左值属性;// 如果传递的是右值引用,std::forward会保留它的右值属性。template <typename T>void wrapper(T&& t) {process(std::forward<T>(t));}//包装函数测试void wrapper_func() {int a = 5;wrapper(a);  // 调用 Lvalue reference 版本wrapper(10); // 调用 Rvalue reference 版本}void task1() {}void task2() {}~q_forward() {}private:int data;
};

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

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

相关文章

MySQL3(多表联查 子查询 流程控制函数,语句 Sql 执行顺序 学生选课表练习)

目录 一、多表联查 1. 等值查询和非等值查询 等值查询 --- 主外键相等 ​编辑非等值查询 2. 连接查询 ​编辑 内连接 ​编辑 左外连接 ​编辑 右外连接 3. UNION 二、子查询 1. where 型子查询&#xff1a; 2. from型子查询: 3. exists型子查询: 4. any, some…

如何使用PHP Curl类库编写高效的爬虫程序?

如何使用php curl类库编写高效的爬虫程序&#xff1f; 摘要&#xff1a;爬虫程序可以用于从网页中获取数据&#xff0c;以实现各种场景下的自动化处理。本文将介绍如何使用PHP Curl类库编写高效的爬虫程序&#xff0c;并提供相关的代码示例。 导语&#xff1a;随着互联网普及…

ArrayList学习

1.2.1 构造方法 方法名说明public ArrayList()创建一个空的集合对象 1.2.2 成员方法 方法名说明public boolean add(E e)将指定的元素追加到此集合的末尾public boolean remove(E e)删除指定元素,返回值表示是否删除成功public E remove(int index)删除指定索引处的元素&…

PVE更新 报错过程解决

Proxmox 报错提示 E: Failed to fetch https://enterprise.proxmox.com/debian/ceph-quincy/dists/bookworm/InRelease 401 Unauthorized E: The repository https://enterprise.proxmox.com/debian/ceph-quincy bookworm InRelease is not signed.Proxmox 报错提示 Tempor…

笔记本重装系统怎么操作? windows电脑重装系统,超实用的四种方法

重新安装操作系统是维护计算机性能和确保系统稳定运行的重要步骤。对于 Windows 笔记本用户而言&#xff0c;熟悉重装系统的方法可以帮助他们解决各种问题&#xff0c;从提高系统速度到修复软件故障。然而具体来讲&#xff0c;笔记本重装系统怎么操作呢&#xff1f;接下来&…

input的23种属性

button 定义可点击的按钮&#xff08;通常与 JavaScript 一起使用来启动脚本&#xff09;。 checkbox 定义复选框。 color 定义拾色器。 date 定义 date 控件&#xff08;包括年、月、日&#xff0c;不包括时间&#xff09;。 datetime 定义 date 和 time 控件&…

AngularJS 参考手册

AngularJS 参考手册 1. 引言 AngularJS,一种由Google维护的开源前端Web框架,自2010年发布以来,已成为Web开发领域的重要工具。它允许开发者使用HTML作为模板语言,并扩展HTML的语法,以清晰简洁地表达应用的组件。本参考手册旨在为开发者提供AngularJS的全面指南,包括其核…

LLDP 基本原理

LLDP 简介 定义 LLDP&#xff08;Link Layer Discovery Protocol&#xff0c;链路层发现协议&#xff09;是 IEEE 802.1ab 中定义的第二层发现&#xff08;Layer 2 Discovery&#xff09;协议。 LLDP 提供了一种标准的链路层发现方式&#xff0c;可以将本端设备的主要能力、…

单片机使用printf在串口输出字符串

把字符串使用printf输出的本质 实际上调用了putchar和串口字符输出函数&#xff0c;参考 以51单片机中的程序为例 在主函数中使用printf函数向串口发送字符串&#xff0c;当然保证已经定义好串口的波特率等参数 while(1){//uart0SendString("start....\n");prin…

服务器巡查脚本

脚本编程步骤 脚本编程一般分为以下几个步骤&#xff1a; 需求分析&#xff1a;根据系统管理的需求&#xff0c;分析脚本要实现的功能、功能实现的层次、实现的命令与语句等&#xff1b; 命令测试&#xff0c;将要用到的命令逐个进行测试&#xff0c;以决定使用的选项要设置…

新书速览|解密AI绘画与修图: Stable Diffusion+Photoshop

《解密AI绘画与修图&#xff1a; Stable DiffusionPhotoshop》 本书内容 《解密AI绘画与修图&#xff1a;Stable DiffusionPhotoshop》全面介绍了Photoshop和Stable Diffusion的交互方式&#xff0c;以及各自的AI功能和具体使用方法。除了讲解功能&#xff0c;还通过实际案例加…

力扣1010.总持续时间可被60整除

力扣1010.总持续时间可被60整除 单次循环遍历 每个数存%60的值 class Solution {public:int numPairsDivisibleBy60(vector<int>& time) {int n time.size();for(int i0;i<n;i)time[i] % 60;int res0;vector<int> cnt(60,0);for(auto t:time){//这么写可…

SpringBoot防抖方案(防止表单重复提交)

SpringBoot防抖方案&#xff08;防止表单重复提交&#xff09; 1.应用场景&#xff08;什么是防抖&#xff09; 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容…

深度遍历-牛牛的果实迷宫

目录 一、问题描述 二、解题思路 1.返回格式 2.使用深度遍历 3.注意上下左右的实现方式 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.返回格式 这个题目的问题返回格式是Point(x,y)&#xff1b;x代表最短路径距离&#xff0c;y表示最短路径数量 如果没有…

Linux中的库

什么是库&#xff1f; 库是一组预先编译好的方法/函数的集合&#xff0c;其他程序想要使用源文件中的函数时&#xff0c;只需在编译可执行程序时&#xff0c;链接上该源文件生成的库文件即可。 库分为两类&#xff1a;静态库和动态库 在Linux系统中&#xff0c;以.a为后缀的…

Animate软件基础:删除图层或文件夹

Animate软件中&#xff0c;图层或者图层文件夹同样可以进行删除操作&#xff0c;不过需要注意的是&#xff0c;删除图层或者删除文件夹&#xff0c;都会将其中所有的内容删除。 要选择图层或文件夹&#xff0c;可以单击时间轴中该图层或文件夹的名称&#xff0c;或者单击图层中…

003 选择排序(lua)

文章目录 1selectionSort.lua2selectionSort.lua复杂度SortingHelper.lua 先挑最值&#xff0c;再把剩下的挑最值&#xff0c;再把剩下的挑最值。。。 1selectionSort.lua -- 排序函数 function selectionSort(arr) -- 外层循环&#xff0c;从数组的第一个元素开始&#xff…

2-自动驾驶关键技术框架

框架 来自《自动驾驶汽车决策与控制》这本书 三大技术 车载平台的关键技术&#xff1a; 环境感知技术&#xff1a;这是自动驾驶车辆能够“看”和“感知”周围世界的技术。它包括使用摄像头、雷达、激光雷达&#xff08;Lidar&#xff09;和超声波传感器来检测和识别道路、障…

LeetCode21-合并两个有序链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xf…

ZYNQ MPSOC烧写问题记录

1、如果带有ARM代码&#xff0c;则ZYNQ MPSOC烧写的烧写是通过ViTIS进行的&#xff0c;通过JTAG模式进行烧写&#xff0c;如下图的PS_MODEx配置成0000&#xff0c;这个只与硬件相关&#xff0c;硬件拉高拉低。 2、如果不带ARM代码&#xff0c;则烧写过程与前版本一致。