详细的完美转发

不要假装努力,结果不会陪你演戏。

文章目录

  • 完美转发的使用场景
  • 完美转发

完美转发的使用场景

请看下面的这个代码

#include<iostream>
using namespace std;
void func(int&& t)
{cout<<"int&&"<<endl;return;
}
void func(int& t)
{cout<<"int&"<<endl;
}
int main()
{int a=10;int b=20;int&& t=a+b;func(t);return 0;
}

我们可以想一下这个代码打印出来的结果是什么样子?
在这里插入图片描述

这个结果可能会跟我们想像的有些差距这里我请大家想一个问题就是我们用右值引用t=a+b那么这个右值引用t到底是一个右值还是左值,其实在面对这一点的时候c++委员会也陷入了纠结,但是最终还是设置为左值,这是为什么呢,因为我们可以想一下如果我们传递过去是一个右值引用的话我们的赋值的时候右值是不能被赋值的,因此在这里c++委员会将右值转会为了左值,可是在实际开发场景中我们有些时候是需要它保留右值特性的,那么这时候需要我们怎么办呢,这也就是完美转发被发明的意义。

完美转发

通过上面的赘述我们可以知道其实完美转发就是在传参的时候保留原有参数的类型属性,那么我们将上面的那个代码改一下

#include<iostream>
using namespace std;
void func(int&& t)
{cout<<"int&&"<<endl;return;
}
void func(int& t)
{cout<<"int&"<<endl;
}
int main()
{int a=10;int b=20;int&& t=a+b;func(forward(t));//完美转发return 0;
}

那么将代码改为上面 那个样子我们的打印结果就可以变为我们想要的场景了那么完美转发在实际开发过程中的使用场景有什么呢?首先就比如说我们的模拟实现链表的push_back(“111”)这个时候这个111很明显用右值引用去接受更为方便。这里我们模拟实现一小部分代码

void push_back(string &&a)
{
insert(_head->next,forward<string>(a);
}
void insert(Node*pos,T&&a)
{
Node*prev=pos->_prev;
Node*newnode=new Node;
newnode->_data=std::forward<string>(a);prev->_nex=newnode;
newnode->_prev=prev;
newnode->_next=pos;
pos->_prev=newnode;
}

好的那么上面就是我们完美转发的一个实际用途,完美转发在我们日常生活中的使用也是非常便捷的它可以保留我们传递参数的原有属性。

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

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

相关文章

牛客网刷题笔记231112 最小k位数+二叉树层序遍历+SQL异常邮件概率

算法题牛客网NC119 最小的k个数 题目&#xff1a; 用了一下python列表的便利&#xff0c;不知道在面试时允许用不。当然最简单的方法其实是直接sort()一下取前k位数即可。本次写的思路如下&#xff1a; 用一个最大容量为k的列表存储结果&#xff0c;遍历n个元素&#xff0c;当…

漏洞复现--IP-guard flexpaper RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

绿盟远程安全评估系统 RSAS 使用体验-难用

最近领导让我用公司采购的RSAS对产品进行漏洞扫描&#xff0c;学习并使用了这个软件&#xff0c;体验就是真的很难用。使用遇到问题时&#xff0c;咨询售后服务&#xff0c;机器人需要有公司认证&#xff0c;不能随便问问题&#xff0c;也是无语了。咨询客服&#xff0c;客服回…

TCP与UDP

文章目录 TCP与UDP传输层的作用端口号UDPTCPUDP首部的格式TCP首部格式 TCP与UDP TCP/IP中有两个具有代表性的传输层协议&#xff0c;它们分别是TCP和UDP。TCP提供可靠的通信传输&#xff0c;而UDP则常被用于让广播和细节控制交给应用的通信传输。总之&#xff0c;根据通信的具…

条码管理在WMS仓储管理系统中的应用

在当今快节奏的商业环境中&#xff0c;仓储管理对于企业的运营和成本控制具有重要意义。为了提高管理效率和准确性&#xff0c;越来越多的企业开始采用条码管理WMS系统。本文将介绍这一系统的应用场景、条码引入WMS仓储管理系统的步骤以及其在仓储管理中的应用价值&#xff0c;…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录&#xff0c;鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile &#xff0c;添加环境变量&#xff0c;php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

【数据结构】Lambda

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; Lambda表达式 1. 背景1.1 语法1.2 函…

二、Linux用户管理

Linux是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须向系统管理员申请一个账户&#xff0c;然后用这个账户进入系统。 每个Linux用户至少属于一个用户组。 用户家目录home下&#xff0c;有各个用户分别创建的家目录&#xf…

网络运维Day14

监控概述 监控的目的 报告系统运行状况每一部分必须同时监控内容包括吞吐量、反应时间、使用率等提前发现问题进行服务器性能调整前&#xff0c;知道调整什么找出系统的瓶颈在什么地方 监控的资源类别 公开数据 Web、FTP、SSH、数据库等应用服务TCP或UDP端口 私有数据 CPU、内…

专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战

前言 OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会&#xff0c;我们采访了 TinyReact 的共建者 Mr 栋同学。 Mr 栋同学是一位热衷于前端技术的开发者&#xff0c;对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中&#xff0…

Power Automate-条件判断和通知操作

在模板中搜索推送通知&#xff0c;选择获取有关重要电子邮件的推送通知 点击创建&#xff0c;再去编辑 该操作的逻辑是收件箱里收到重要性为高的电子邮件时进行下一步 可以更改邮件的重要性选择&#xff0c;点击下拉框重新选择即可 还可以在此步骤下再创建新操作&#xff0c;选…

做外贸一个小失误可能会带来大的损失

在外贸里&#xff0c;虽然很多事情都是不可控的&#xff0c;但是我们还是需要做好自己该做的事情&#xff0c;将危险和不可控降低到最低的程度。那如何能够降低到最低呢&#xff1f; 比如在做合同&#xff0c;发票或者单据的时候&#xff0c;我们可能会喜欢依照公司固定的模板…