使用 std::forward 的作用---完美转发

std::forward是什么

使用 std::forward 是为了实现完美转发(perfect forwarding)。

完美转发是一种技术,用于将函数模板的参数按原始类型转发给其他函数或对象。它可以保持原始参数的值类别(lvalue 或 rvalue)和 const 限定符,从而实现更高的灵活性和效率。

在这个特定的代码片段中,std::forward(func) 是将传递给 enqueue 函数的 func 参数完美转发给 std::packaged_task<int()> 对象的构造函数。

不使用std::forward的危害

#include <iostream>
#include <utility>void processValue(int& value)
{std::cout << "processValue(int&): " << value << std::endl;value = 100;
}void processValue(const int& value)
{std::cout << "processValue(const int&): " << value << std::endl;
}template <typename T>
void forwardExample(T&& value)
{processValue(value);
}template <typename T>
void forwardExample2(T&& value)
{processValue(std::forward<T&&>(value));
}template <typename T>
void forwardExample3(T&& value)
{processValue(std::forward<T>(value));
}int main()
{int x = 42;forwardExample(x); // 传递左值forwardExample(123); // 传递右值forwardExample2(x); // 传递左值forwardExample2(123); // 传递右值forwardExample3(x); // 传递左值forwardExample3(123); // 传递右值return 0;
}

以上例子的对应输出如下:

processValue(int&): 42
processValue(int&): 123
processValue(int&): 100
processValue(const int&): 123
processValue(int&): 100
processValue(const int&): 123

在这个例子中,我定义了2个重载的 processValue 函数,一个接受非常量左值引用,另一个接受常量左值引用。然后,我们定义了一个模板函数 forwardExample,它接受一个通用引用参数 value。

在 forwardExample 函数中,我们将参数 value 传递给 processValue 函数。但是,这里我们没有使用 std::forward 进行完美转发。

当我们在 main 函数中调用 forwardExample(x) 时,我们传递了一个左值 x。由于没有使用 std::forward,value 参数在 forwardExample 中被视为左值引用,并且调用了 processValue(int&),输出的结果为 processValue(int&): 42。这是符合预期的。

然而,当我们在 main 函数中调用 forwardExample(123) 时,我们传递了一个右值。同样,由于没有使用 std::forward,value 参数在 forwardExample 中仍然被视为左值引用,并且调用了 processValue(int&),而不是我们期望的 processValue(const int&)。结果输出为 processValue(int&): 123,而不是 processValue(const int&): 123。

这个例子展示了在没有使用 std::forward 进行完美转发时,参数的值类别和 const 限定符会被改变,导致函数重载的选择不符合预期。

如果我们在 forwardExample 函数中使用 std::forward 来进行完美转发,即 processValue(std::forward(value)),那么参数的值类别和 const 限定符将被正确地保留,从而选择正确的函数重载。

所以,使用 std::forward 进行完美转发可以避免这种错误的函数重载选择,确保参数以原始的值类别和 const 限定符传递给下游函数。

还有一种万能的完美转发,即正确的类型上再套一层T&&,根据引用折叠的原则,依旧是正确的类型,即这里的forwardExample2,大家可以留意一下完美转发的两种手法。

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

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

相关文章

科技创新创业

科技创新创业是一个涉及多个方面的过程&#xff0c;主要包括以下几个方面&#xff1a; 创意产生&#xff1a;创业的起始点通常是一个新的创意或想法&#xff0c;这可能是一个新的产品、服务或技术的概念。这个创意需要独特且具有商业潜力。市场调研&#xff1a;一旦有了创意&a…

行业赋能|同创永益出席数据中心业务连续性管理国标应用推广研讨会

2023年12月7日&#xff0c;ITSS数据中心业务连续性管理国标应用推广研讨会在上海交通银行浦江数据中心召开。来自交通银行、浦发银行、太平洋保险、上证数据、海通证券、国泰君安、申万宏源、太平保险、中债登、神州信息、翰纬科技、同创永益等单位20余名专家出席会议&#xff…

2024第15届电子教育、电子商务、电子管理和电子学习国际会议

第十五届电子教育、电子商务、电子管理和电子学习国际会议&#xff08;IC4E 2024&#xff09;将于2024年3月18日-21日在日本福冈举办。本次会议以电子技术为核心&#xff0c;围绕电子教育、电子商务、电子管理以及电子学习等各个方面展开研讨&#xff0c;为相关领域的专家学者们…

独孤思维:​做副业项目,保持平常心

做副业项目&#xff0c;保持平常心。 不能因为自认为很好的作品&#xff0c;数据不好看&#xff0c;就哭哭闹闹。 平常心&#xff0c;坚持日更&#xff0c;保持持续刷新自己&#xff0c;提升自己的飞轮状态。 不以物喜&#xff0c;不以己悲&#xff0c;哈哈。 无论是副业还是…

检查密码(字符串)

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成&#xff0c;并且只能有英文字母、数字和小数点 .&#xff0c;还必须既有字母也有数字。 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤…

2.SPSS数据文件的建立和管理

文章目录 数据文件的特点建立SPSS数据文件步骤 数据文件的结构变量的规则 数据的录入和保存录入数据保存文件 数据的编辑数据定位 数据文件的特点 SPSS数据库文件包括文件结构和数据两部分 SPSS数据文件中的一列数据称为一个变量。每个变量都应有一个名称&#xff0c;即&…

力扣 | 509. Fibonacci

509. 斐波那契数 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。 该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a;F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n …

自动计算薪资-全优学堂

功能说明 全优学堂薪资模块则根据基础薪资、历史上课情况、课程销售情况自动计算员工薪资&#xff0c;帮助您更好地进行成本管理。系统根据教职工的排班情况、课时数和提成规则&#xff0c;自动计算教职工的薪资&#xff0c;大大减轻工资管理负担。 #1. 基础薪资配置 设置本…

智能音箱喇叭底噪大的问题

智能音箱喇叭底噪大的问题 3w的喇叭&#xff0c;放大8到12倍。speaker外放模式. 播放时底噪声很大&#xff0e;可在播放时音量减到最小凑近听&#xff0c;发现在半米的范围内都能听到底噪声&#xff0e; 分析过程 引原始的pa输出线出来引功放处理后的音频信号输出线出来&…

积萨伯爵不懈追求恒久卓越,花为缘集团不断探索时尚的型格魅力

近年来&#xff0c;高端腕表凭借着卓越的制表技艺、悠久的制表历史以及不拘一格的美学特色&#xff0c;逐渐受到各大明星演员&#xff0c;时尚博主的青睐&#xff0c;成为他们出席各大重要场合&#xff0c;彰显个人品位和地位的时尚百搭单品。 积萨伯爵作为专业做培育珠宝和高…

复习python从入门到实践——函数function

复习python从入门到实践——函数function 函数是特别难的&#xff0c;大家一定要好好学、好好复习、反复巩固。函数没学好&#xff0c;会为后面造成很大困扰。 教科书中函数举例会稍微有点复杂。在此章复习中&#xff0c;我将整理出容易疏漏和混淆的知识点&#xff0c;并用最简…

Django 入门教程|Web开发|用户管理实战

简介 Django是一个主流的Python Web框架&#xff0c;用于快速开发 Web 应用程序。功能强大&#xff0c;Python Web应用开发的第一选择。 特点 ORM&#xff08;对象关系映射&#xff09;&#xff1a; Django 提供了一个强大的 ORM&#xff0c;允许开发者通过 Python 代码来定义…

LLM、AGI、多模态AI 篇四:ChatGLM3部署和应用

文章目录 系列简介部署和运行推荐硬件要求部署步骤配置Python环境下载模型文件克隆项目代码安装依赖运行Demo修改demo源代码运行Demo可执行文件应用代码调用Langchain+RAG+ChatGLM3OpenAI API 支持

塔式服务器的好处

之前我们聊过服务器可以根据外观来进行分类&#xff0c;分别有刀片式服务器、塔式服务器和机架式服务器&#xff0c;那今天我们就来了解一下塔式服务器的好处有哪些&#xff1f; 塔式服务器是我们最常见的一种服务器结构&#xff0c;整体外观是立式结构&#xff0c;占地面积小&…

Shell 专栏目录

使用 1. shell 切片参数解释 2. shell 命令替换&#xff08;将 curl 等输出的内容使用变量接收&#xff09; 3. shell 数字运算相关操作 4. shell 小数结果转为百分制&#xff0c;并去除小数部分 问题 1. shell 脚本文件换行错误

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作&#xff0c;本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中&#xff0c;在生成的exe中。动态链接库是在程序运行时链接的&#xff0c;可以在程序运行时调用加载库函数的方法来实现&…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

苹果电脑交互式原型设计软件Axure RP 9 mac特色介绍

Axure RP 9 for Mac是一款交互式原型设计软件&#xff0c;使用axure rp9以最佳的方式展示您的作品&#xff0c;优化现代浏览器并为现代工作流程设计。同时确保您的解决方案正确完整地构建。Axure RP 9 for Mac为您整理笔记&#xff0c;将其分配给UI元素&#xff0c;并合并屏幕注…

YOLO物体检测-系列教程6:YOLOv5源码解析1

计算机视觉 全教程 目录 物体检测 系列教程 总目录 1、基本概述 YOLOv5没有一篇对应的论文&#xff0c;是一个对v4更好的实现v5版本是一个在github更新的基于工程项目的实现基本上和v4没有差异&#xff0c;只不过在整个项目上做出了更好的实现效果主要基于github的文档介绍来…