C++ std::forward()
在线调试网站:
https://wandbox.org/
#include <iostream>
#include <thread>
#include <mutex> void func(int &&args) {std::cout << args << std::endl;
}int main () {int a = 10;func(20); func(a); func(std::move(a)); return 0;
}
编译错误信息:需要的是右值,但是传入的是左值,类型不匹配;
prog.cc: In function 'int main()':
prog.cc:13:10: error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'13 | func(a);| ^
prog.cc:5:17: note: initializing argument 1 of 'void func(int&&)'5 | void func(int &&args) {| ~~~~~~^~~~
#include <iostream>
#include <thread>
#include <mutex> void func(int &arg) {std::cout << "func lvalue:" << arg << std::endl;
}
void func(int &&arg) {std::cout << "func rvalue" << arg << std::endl;
}template <typename T>
void wrapper(T &&args) {func(args);
}
int main() {int a = 10; wrapper(a);wrapper(20);return 0;
}
最终都调用了func(int &arg)
func lvalue:10
func lvalue:20
虽然咱们调用wrapper()函数时,传入的参数一个是左值,一个是右值,可是最终的输出确都是左值。缘由是咱们在中间加了一层转发函数wrapper()。
引用叠加,引用是能够叠加的,对于 T &&a; 叠加规则以下:
(1)当T类型为 Type 时,a 为 Type &&a,右值引用。
(2)当T类型为 Type& 时,a为 Type &a,左值引用。(这点还在思考中)
(3)当T类型为 Type&& 时,a为 Type &&a,右值引用。
经过引用叠加,分析以上示例可知,调用wrapper()时,wrapper(a) 是调用的原型是 wrapper(int &),是左值调用;wrapper(20)调用的原型是wrapper(int &&),是右值调用。可是在wrapper()函数内部,不管如何,args都是一个左值,在调用func()函数的时候,调用的func()原型老是func(int &)。
所以,右值引用属性不能被转发。因此,C++11提供了std::forward()函数用于完美转发。即,在转发过程当中,左值引用在被转发以后仍然保持左值属性,右值引用在被转发以后依然保持右值属性。
#include <iostream>
#include <thread>
#include <mutex> void func(int &arg) {std::cout << "func lvalue:" << arg << std::endl;
}
void func(int &&arg) {std::cout << "func rvalue:" << arg << std::endl;
}template <typename T>
void wrapper(T &&args) {//func(args);func(std::forward<T>(args));
}
int main() {int a = 10; wrapper(a);wrapper(20);return 0;
}
func lvalue:10
func rvalue:20
思考:
1 完美转发解决了什么问题;
2 经典应用场景是什么;(锁,线程等需要move语义的场景)
相关文章:
C++ std::forward()
在线调试网站: https://wandbox.org/ #include <iostream> #include <thread> #include <mutex> void func(int &&args) {std::cout << args << std::endl; }int main () {int a 10;func(20); …...
常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序
时间复杂度O(n^2) 1、插入排序 (Insertion Sort) 从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到…...
go语言day2
使用cmd 中的 go install ; go build 命令出现 go cannot find main module 错误怎么解决? go学习-问题记录(开发环境)go: cannot find main module; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…...
vue echarts画多柱状图+多折线图
<!--多柱状图折线图--> <div class"echarts-box" id"multiBarPlusLine"></div>import * as echarts from echarts;mounted() {this.getMultiBarPlusLine() },getMultiBarPlusLine() {const container document.getElementById(multiBar…...
cesium for unity 打包webgl失败,提示不支持
platform webgl is not supported with HDRP use the Vulkan graphics AR instead....
python开发基础——day7 序列类型方法
一、初识序列类型方法 序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据,也可以对数据进行更方便的操作,这个操作是叫增删改查(crud) ( 增加(Creat),读取查询(Retrieve),更新(Update)…...
用java写一个二叉树翻转
class TreeNode {int val;TreeNode left, right;TreeNode(int val) {this.val val;left right null;} }public class BinaryTree {TreeNode root;// 递归翻转二叉树public TreeNode invertTree(TreeNode root) {if (root null) {return null;}// 递归翻转左子树和右子树Tre…...
数学建模系列(3/4):典型建模方法
目录 引言 1. 回归分析 1.1 线性回归 基本概念 Matlab实现 1.2 多元回归 基本概念 Matlab实现 1.3 非线性回归 基本概念 Matlab实现 2. 时间序列分析 2.1 时间序列的基本概念 2.2 移动平均 基本概念 Matlab实现 2.3 指数平滑 基本概念 Matlab实现 2.4 ARIM…...
AI播客下载:Machine Learning Street Talk(AI机器学习)
该频道由 Tim Scarfe 博士、Yannic Kilcher 博士和 Keith Duggar 博士管理。 他们做了出色的工作,对每个节目进行了彻底的研究,并与机器学习行业中一些受过最高教育、最全面的嘉宾进行了双向对话。 每一集都会教授一些新内容,并且提供未经过滤…...
鱼缸补水器工作原理是什么
鱼缸补水器是一种应用广泛的智能设备,主要用于自动监测和补充鱼缸内的水位,以确保鱼类生存环境的稳定。其工作原理简单而高效,为饲主提供了方便和安全的使用体验。 该补水器通常由两部分组成:控制器和吸盘。首先,用户…...
Linux-Tomcat服务配置到系统服务
目录 前言一、系统环境二、配置步骤step1 了解环境的安装路径step2 配置生成tomcat.pid文件step3 配置tomcat.service文件 三、测试systemctl命令管理Tomcat服务3.1 systemctl命令启动Tomcat服务3.2 systemctl命令查看Tomcat服务3.3 systemctl命令关闭Tomcat服务3.4 systemctl命…...
Python抓取高考网图片
Python抓取高考网图片 一、项目介绍二、完整代码一、项目介绍 本次采集的目标是高考网(http://www.gaokao.com/gkpic/)的图片,实现图片自动下载。高考网主页如下图: 爬取的流程包括寻找数据接口,发送请求,解析图片链接,向图片链接发送请求获取数据,最后保存数据。 二…...
Vue配置项data
data 目录 data 目录类型介绍关键原理编译过程 Vue2Vue3 📌Vue.js 中的 data(Obj/Function)属性是 Vue 实例的一个配置选项 类型介绍 对象式 对于根实例或者非复用组件,通常直接提供一个对象字面量作为 data 的值。在对象式中…...
在IDEA 2024.1.3 (Community Edition)中创建Maven项目
本篇博客承继自博客:Windows系统Maven下载安装-CSDN博客 Maven版本:maven-3.9.5 修改设置: 首先先对Idea的Maven依赖进行设置;打开Idea,选择“Costomize”,选择最下边的"All settings" 之后找…...
动手学深度学习(Pytorch版)代码实践 -卷积神经网络-28批量规范化
28批量规范化 """可持续加速深层网络的收敛速度""" import torch from torch import nn import liliPytorch as lp import matplotlib.pyplot as pltdef batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):""&quo…...
Apache Paimon系列之:Append Table和Append Queue
Apache Paimon系列之:Append Table和Append Queue 一、Append Table二、Data Distribution三、自动小文件合并四、Append Queue五、压缩六、Streaming Source七、Watermark Definition八、Bounded Stream 一、Append Table 如果表没有定义主键,则默认为…...
Vue使用vue-esign实现在线签名 加入水印
Vue在线签名 一、目的二、样式三、代码1、依赖2、代码2.1 在线签名组件2.1.1 基础的2.1.2 携带时间水印的 2.2父组件 一、目的 又来了一个问题,直接让我在线签名(还不能存储base64),并且还得上传,我直接***违禁词。 好…...
与码无关:分数限制下,选好专业还是选好学校?
本文的目标读者:24届的高考生和家长。 写这篇非技术性文章,是因为我看到了24届考生和21年的我同样迷茫。 事先声明,本文带有强烈的个人思考色彩,可能会引起不适,如有不同观点,欢迎在评论区讨论。 一、前言…...
什么是负载均衡技术?
随着网络技术的快速发展,互联网行业也越来越广泛,人们的日常生活中也离不开网络技术,大量的用户进行浏览访问网站时,企业会使用负载均衡技术,降低当前网站的负载,以此来提高网站的访问速度。 今天小编就来给…...
存在重复元素Ⅱ python3
存在重复元素Ⅱ 问题描述解题思路代码实现复杂度 问题描述 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在,返回 true ;否则ÿ…...
【CV炼丹师勇闯力扣训练营 Day13:§6二叉树1】
CV炼丹师勇闯力扣训练营 代码随想录算法训练营第13天 二叉树的递归遍历 二叉树的迭代遍历、统一迭代 二叉树的层序遍历 一、二叉树的递归遍历(深度优先搜索) 【递归步骤】 1.确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理…...
代码随想录算法训练营第46天 [ 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III ]
代码随想录算法训练营第46天 [ 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III ] 一、121. 买卖股票的最佳时机 链接: 代码随想录. 思路:dp[i][0] 第i天持有股票的最大利润 dp[i][1] 第i天不持有股票的最大利润 做题状态:…...
基于IDEA的Maven简单工程创建及结构分析
目录 一、用 mvn 命令创建项目 二、用 IDEA 的方式来创建 Maven 项目。 (1)首先在 IDEA 下的 Maven 配置要已经确保完成。 (2)第二步去 new 一个 project (创建一个新工程) (3)…...
解锁空间数据奥秘:ArcGIS Pro与Python双剑合璧,处理表格数据、矢量数据、栅格数据、点云数据、GPS数据、多维数据以及遥感云平台数据等
ArcGISPro提供了用户友好的图形界面,适合初学者快速上手进行数据处理和分析。它拥有丰富的工具和功能,支持各种数据格式的处理和分析,适用于各种规模的数据处理任务。ArcGISPro在地理信息系统(GIS)领域拥有广泛的应用&…...
后端路线指导(4):后端春招秋招经验分享
后端春招&秋招经验分享 春招(暑期实习) /秋招是应届生非常重要的应聘时间,每一个想就业的同学一定要有所了解! 本篇内容,老白将与大家分享暑期实习和秋招如何应对招聘的个人经验,希望每个同学看完都能有所收获! 首先说明一下老白对于面试核心竞争力的…...
面完小红书算法岗,心态崩了。。。
暑期实习基本结束了,校招即将开启。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。提前准备才是完全之策。 最近,我们又陆续整理了很多大厂的面试题,…...
Android 断点续传进阶之多线程下载
今天继续下载的风骚走位内容—多线程多文件断点续传 Android 断点续传基础之单线程下载:http://blog.csdn.net/qq_27489007/article/details/53897653 效果图: 文件关系: 所需内容 多文件下载列表的显示 启动多个线程分段下载 使用通知栏…...
Python爬虫学习 | Scrapy框架详解
一.Scrapy框架简介 何为框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。scrapy框架是一个为了爬取网站数据,提取数据的框架,我们熟知爬虫总共有四大部分&am…...
用户态协议栈05—架构优化
优化部分 添加了in和out两个环形缓冲区,收到数据包后添加到in队列;经过消费者线程处理之后,将需要发送的数据包添加到out队列。添加数据包解析线程(消费者线程),架构分层 #include <rte_eal.h> #inc…...
模拟退火算法
模拟退火算法(Simulated Annealing, SA)是一种用于全局优化问题的概率搜索算法,其灵感来自于金属退火过程。在金属退火中,材料被加热到高温,然后缓慢冷却,以减少其晶格中的缺陷并达到最小能量状态。模拟退火…...
青岛seo搜索优化/seo手机关键词排行推广
前言 本文讲述怎么实现动态加载组件,并借此阐述适配器模式。 一、普通路由例子 import Center from page/center; import Data from page/data;function App(){return (<Router><Switch><Route exact path"/" render{() > (<Redirec…...
天津网站制作软件/开通网站需要多少钱
1.环境配置教程 环境变量、安装版、配置版 2.编写启动tomcat的批处理文件 3.改变端口 4.虚拟目录 转载于:https://www.cnblogs.com/bdqczhl/p/5929741.html...
外星人做的网站/百度收录快的发帖网站
设计人员往往忽略高容量、多层陶瓷电容(MLCC)随其直流电压变化的特性。所有高介电常数或II类电容(B/X5R R/X7R和F/Y5V特性)都存在这种现象。然而,不同类型的MLCC变化量区别很大。Mark Fortunato曾经写过一篇关于该主题的文章,给出的结论是:您…...
平湖市建设局网站/网站百度收录批量查询
具体详细可参考该篇博文:七、加载数据集 ①准备数据集 以泰坦尼克号数据集(titanic.csv)为例 下载完解压,将解压后得到的压缩包放到指定的路径下,我这边放到了我的jupyter里面了 里面有一些文本信息,仅使用数字信息ÿ…...
现在做网站还用dw做模板了吗/建设网站的步骤
近期,爱奇艺携手华为在华为cLab创新实验室完成了基于5G MECCDN的边缘加速业务验证,通过实现在接近用户一端完成数据存储、计算与分析——即5G MEC的规模化落地,打通5G商业落地的核心技术的关键一环,在视频行业中抢跑5G商用落地。2…...
宿迁网络公司/太原百度快照优化排名
有四个人要在深夜通过一座桥。这座桥最多只能承受两个人的重量,而且必须打着手电筒才能通过。四个人只有一把手电筒,并且每个人的行走速度也不一样:第一个人通过这座桥要花1分钟,第二个人要花2分钟,第三个人要花5分钟&…...