当前位置: 首页 > article >正文

【C++11】折叠引用和完美转发

目录

  • 一. 前言
  • 二. 引用折叠
    • 引用折叠的规则
  • 三. 完美转发
    • 完美转发适用场景
    • 完美转发底层实现
      • 思考1
      • 思考2

一. 前言

在函数传参时,如果想保持某个参数的属性不改变,需要完美转发,而完美转发的实现需要折叠引用的帮助

二. 引用折叠

在语法上,c++不能定义引用的引用,如 int & && r=i,这样会报错,但是通过模板或typedef的类型可以构成引用的引用,

引用折叠的规则

  1. 除了右值引用的右值引用,其他组和都是左值
  • T& & → T& (左值引用的左值引用折叠为左值引用)

  • T& && → T& (左值引用的右值引用折叠为左值引用)

  • T&& & → T& (右值引用的左值引用折叠为左值引用)

  • T&& && → T&& (右值引用的右值引用折叠为右值引用)

  1. 通过引用规则我们发现,T&&的结果可以保持T本身的属性,所以T&&也被称为万能引用,

三. 完美转发

完美转发适用场景

从下图可以看出,在最开始Function函数中传入的是右值,但在Func中却变成了左值,这是由于右值表达式的属性是左值,
在这里插入图片描述

这样就破坏了最开始传入的值的属性
想要保持表达式的属性,就需要用完美转发来解决,见下图
在这里插入图片描述

完美转发底层实现

完美转发的本质是函数模板,通过引用折叠实现,在forward内部进行强转,然后再引用折叠返回,
std::remove_reference_t& t 移除T最外层的引用修饰,使不管传入什么类型,t的类型都是左值引用类型

思考1

思考1:为什么需要保证t的类型是左值引用?
直接用原类型不行么 T&& forward(T&& t)
传入左值时,T被推导为T&,T&->T&,没有问题
传入右值时,T被推导为T,T->T&&,左值向右值转化,危险操作

template <class T>
T&& forward(std::remove_reference_t<T>& t)
{//std::remove_reference_t<T> 类型萃取模板,移除T的最外层引用修饰,return static_cast<T&&>(t);·
}
template <class T>
void Function(T&& t)
{//Func(std::forward<T>(t));Func(forward<T>(t));//Func(t);
}int main()
{int&& n = 10;Function(n);return 0;
}

思考2

思考2:为什么需要用std::remove_reference_t& 来移除最外层修饰的引用,
T&& forward(T& t) 不行么?
传入左值时
T& && forward(T& & ) 实例化-> T& forward(T & ) 没有问题
传入右值时
T&& && forward(T&& & ) 实例化-> T&& forward(T & ) 看似没有问题
虽然 int&& & 理论上可以折叠为 int&,但 C++ 类型系统禁止直接声明这种组合:

相关文章:

【C++11】折叠引用和完美转发

目录 一. 前言二. 引用折叠引用折叠的规则 三. 完美转发完美转发适用场景完美转发底层实现思考1思考2 一. 前言 在函数传参时&#xff0c;如果想保持某个参数的属性不改变&#xff0c;需要完美转发&#xff0c;而完美转发的实现需要折叠引用的帮助 二. 引用折叠 在语法上&am…...

数据结构:递归:自然数之和

目录 递归解法 &#x1f539;第一步&#xff1a;定义本质问题 &#x1f539;第二步&#xff1a;分解问题结构 &#x1f539;第三步&#xff1a;定义初始条件 &#x1f539;第四步&#xff1a;递归思想的自然生成 循环解法 &#x1f539;第 1 步&#xff1a;定义问题最小…...

网易 - 灵犀办公文档

一. 企业介绍 网易是中国领先的互联网技术公司&#xff0c;为用户提供免费邮箱、游戏、搜索引擎服务&#xff0c;通过开设新闻、娱乐、体育等30多个内容频道&#xff0c;以及博客、视频、论坛等互动交流&#xff0c;网聚人的力量。 为了给中小企业和个人打造一款综合性办公产…...

【C++】模板与特化技术全面教程(claude sonnet 4)

第一章&#xff1a;模板的基础概念 (Template Fundamentals) 1.1 什么是模板&#xff1f; 模板 (Template) 是C中的一种泛型编程 (Generic Programming) 机制&#xff0c;它允许我们编写与类型无关的代码。想象一下&#xff0c;如果我们要为不同的数据类型编写相同逻辑的函数&a…...

ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”

“高内聚、低耦合”是面向对象编程中非常重要的设计原则&#xff0c;它有助于提高代码的可维护性、扩展性和复用性。 1. 初衷&#xff1a;为什么会有这个原则&#xff1f; 在软件开发中&#xff0c;随着业务需求的复杂化&#xff0c;代码难免会变得越来越庞大。如果开发者将一…...

RagFlow优化代码解析(一)

引子 前文写到RagFlow的环境搭建&推理测试&#xff0c;感兴趣的童鞋可以移步&#xff08;RagFlow环境搭建&推理测试-CSDN博客&#xff09;。前文也写过RagFLow参数配置&测试的文档&#xff0c;详见&#xff08;&#xff09;。很少写关于具体代码的blog&#xff0c…...

【python与生活】用 Python 从视频中提取音轨:一个实用脚本的开发与应用

在当今数字化的时代&#xff0c;视频内容无处不在。无论是学习教程、会议记录、在线讲座还是娱乐视频&#xff0c;我们每天都会接触到大量的视频资源。有时候&#xff0c;我们可能只对视频中的音频部分感兴趣&#xff0c;比如提取讲座的音频用于后续收听&#xff0c;或者从电影…...

深度强化学习赋能城市消防优化,中科院团队提出DRL新方法破解设施配置难题

在城市建设与发展中&#xff0c;地理空间优化至关重要。从工业园区选址&#xff0c;到公共服务设施布局&#xff0c;它都发挥着关键作用。但传统求解方法存在诸多局限&#xff0c;如今&#xff0c;深度学习技术为其带来了新的转机。 近日&#xff0c;在中国地理学会地理模型与…...

云原生周刊:探索 Gateway API v1.3.0

开源项目推荐 WatchAlert WatchAlert 是一个轻量级、云原生的多数据源监控告警引擎&#xff0c;支持 AI 驱动的智能告警分析&#xff0c;旨在帮助升级您的监控系统架构。该项目基于 Go 和 React 开发&#xff0c;提供了现代化的前后端架构。后端使用 Go 语言&#xff0c;结合…...

008房屋租赁系统技术揭秘:构建智能租赁服务生态

房屋租赁系统技术揭秘&#xff1a;构建智能租赁服务生态 在房地产租赁市场日益活跃的当下&#xff0c;房屋租赁系统成为连接房东与租客的重要数字化桥梁。该系统集成用户管理、房屋信息等多个核心模块&#xff0c;面向管理员、房东和用户三类角色&#xff0c;通过前台展示与后…...

Python训练打卡Day41

简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 → Batch…...

spring-boot-admin实现对微服务监控

spring-boot-admin可以对微服务的状态进行监控&#xff0c;步骤如下&#xff1a; 1、添加spring-boot-admin和nacos依赖 <!-- nacos注册中心 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-n…...

Linux 权限管理入门:从基础到实践

文章目录 引言一、Linux 权限管理概述二、文件权限值的表示方法三、文件访问权限的设置&#xff08;chmod&#xff09;四、file指令&#xff1a;快速识别文件类型五、目录的权限六、普通文件的权限七、权限总结八、粘滞位 引言 在 Linux 系统中&#xff0c;权限管理是确保多用…...

Mycat的监控

参考资料&#xff1a; 参考视频 参考博客 Mysql分库分表&#xff08;基于Mycat&#xff09;的基本部署 MySQL垂直分库&#xff08;基于MyCat&#xff09; Mysql水平分表&#xff08;基于Mycat&#xff09;及常用分片规则 视频参考资料及安装包&#xff1a; https://pan.b…...

Glide源码解析

前言 Glide是一款专为Android设计的开源图片加载库。有以下特点&#xff1a;1.支持高效加载网络、本地及资源图片&#xff1b;2.具备良好的缓存策略及生命周期管理策略&#xff1b;3.提供了简易的API和强大的功能。本文将对其源码进行剖析。 基本使用 dependencies {compile …...

7.RV1126-OPENCV cvtColor 和 putText

一.cvtColor 1.作用 cvtColor 是 OPENCV 里面颜色转换的转换函数。能够实现 RGB 图像转换成灰度图、灰度图转换成 RGB 图像、RGB 转换成 HSV 等等 2.API CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0 ); 第一个参数&#xff1a;…...

Android 之 kotlin 语言学习笔记二(编码样式)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/style-guide?hlzh-cn#whitespace 1、源文件命名 所有源文件都必须编码为 UTF-8。如果源文件只包含一个顶级类&#xff0c;则文件名应为该类的名称&#xff08;区分大小写&#xff09;加上 .kt 扩展名。…...

Redisson单机模式

redisson调用unlock的过程 Redisson 是一个基于 Redis 的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;框架&#xff0c;提供了分布式和可扩展的数据结构和服务。Redisson 的 unlock 方法用于释放锁。下面是 unlock 方法的调用过程&#xff1a; 获取锁的状…...

数据结构第6章 图(竟成)

第 6 章 图 【考纲内容】 1.图的基本概念 2.图的存储及基本操作&#xff1a;(1) 邻接矩阵法&#xff1b;(2) 邻接表法&#xff1b;(3) 邻接多重表、十字链表 3.图的遍历&#xff1a;(1) 深度优先搜索&#xff1b;(2) 广度优先搜索 4.图的基本应用&#xff1a;(1) 最小 (代价) 生…...

机器人现可完全破解验证码:未来安全技术何去何从?

引言 随着计算机视觉技术的飞速发展&#xff0c;机器学习模型现已能够100%可靠地解决Google的视觉reCAPTCHAv2验证码。这标志着一个时代的结束——自2000年代初以来&#xff0c;CAPTCHA&#xff08;"全自动区分计算机与人类的图灵测试"的缩写&#xff09;一直是区分…...

CppCon 2014 学习:(Costless)Software Abstractions for Parallel Architectures

硬件和科学计算的演变关系&#xff1a; 几十年来的硬件进步&#xff1a;计算机硬件不断快速发展&#xff0c;从提升单核速度&#xff0c;到多核并行。科学计算的驱动力&#xff1a;科学计算需求推动硬件创新&#xff0c;比如需要更多计算能力、更高性能。当前的解决方案是并行…...

网络爬虫 - App爬虫及代理的使用(十一)

App爬虫及代理的使用 一、App抓包1. App爬虫原理2. reqable的安装与配置1. reqable安装教程2. reqable的配置3. 模拟器的安装与配置1. 夜神模拟器的安装2. 夜神模拟器的配置4. 内联调试及注意事项1. 软件启动顺序2. 开启抓包功能3. reqable面板功能4. 夜神模拟器设置项5. 注意事…...

Kafka集群部署(docker容器方式)SASL认证(zookeeper)

一、服务器环境 序号 部署版本 版本 1 操作系统 CentOS Linux release 7.9.2009 (Core) 2 docker Docker version 20.10.6 3 docker-compose docker-compose version 1.28.2 二、服务规划 序号 服务 名称 端口 1 zookeeper zookeeper 2181,2888,3888 2 ka…...

【python爬虫】利用代理IP爬取filckr网站数据

亮数据官网链接&#xff1a;亮数据官网...

群晖 NAS 如何帮助培训学校解决文件管理难题

在现代教育环境中&#xff0c;数据管理和协同办公的效率直接影响到教学质量和工作流畅性。某培训学校通过引入群晖 NAS&#xff0c;显著提升了部门的协同办公效率。借助群晖的在线协作、自动备份和快照功能&#xff0c;该校不仅解决了数据散乱和丢失的问题&#xff0c;还大幅节…...

NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)

自然语言处理&#xff08;NLP&#xff09;的核心挑战在于让机器“理解”人类语言。传统方法依赖独热编码&#xff08;One-hot Encoding&#xff09; 表示单词&#xff0c;但它存在严重缺陷&#xff1a;每个单词被视为孤立的符号&#xff0c;无法捕捉词义关联&#xff08;如“国…...

P1438 无聊的数列/P1253 扶苏的问题

因为这两天在写线性代数的作业&#xff0c;没怎么写题…… P1438 无聊的数列 题目背景 无聊的 YYB 总喜欢搞出一些正常人无法搞出的东西。有一天&#xff0c;无聊的 YYB 想出了一道无聊的题&#xff1a;无聊的数列。。。 题目描述 维护一个数列 ai​&#xff0c;支持两种操…...

嵌入式学习笔记 - 新版Keil软件模拟时钟Xtal灰色不可更改的问题

在新版Keil软件中&#xff0c;模拟时钟无法修改XTAL频率&#xff0c;默认只能使用12MHz时钟。‌这是因为Keil MDK从5.36版本开始&#xff0c;参数配置界面不再支持修改系统XTAL频率&#xff0c;XTAL选项变为灰色&#xff0c;无法修改。这会导致在软件仿真时出现时间错误的问题&…...

k8s的出现解决了java并发编程胡问题了

Kubernetes&#xff08;K8s&#xff09;作为一种开源的容器编排平台&#xff0c;极大地简化了应用程序的部署、管理和扩展。这不仅解决了很多基础设施方面的问题&#xff0c;也间接解决了Java并发编程中的一些复杂问题。本文将详细探讨Kubernetes是如何帮助解决Java并发编程中的…...

如何利用大语言模型生成特定格式文风的报告类文章

在这个算法渗透万物的时代,我们不再仅仅满足于大语言模型(LLM)能“写”,更追求它能“写出精髓,写出风格”。尤其在专业且高度格式化的报告类文章领域,仅仅是内容正确已远远不够,文风的精准复刻才是决定报告是否“对味儿”、能否被目标受众有效接受的关键。这不再是简单的…...