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

C++进阶:1. 引用折叠规则

C++ 引用折叠规则

引用折叠(Reference Collapsing)是 C++ 模板和auto类型推导中的核心隐式规则,专门解决多层引用嵌套(如T& &T&& &)的问题——C++ 语法不允许直接写“引用的引用”,编译器会通过引用折叠将多层引用化简为单层引用

一、核心规则

只有2 条铁律,所有嵌套引用最终都会被折叠成:

  1. 只要任意一层是左值引用(&),最终结果就是左值引用(&)
  2. 只有两层都是右值引用(&&),最终结果才是右值引用(&&)

简化表格:

嵌套写法折叠结果口诀
T& &T&有左则左
T& &&T&有左则左
T&& &T&有左则左
T&& &&T&&双右才右

注意:这是编译器自动执行的规则,你不能手动写T& &,但模板/auto推导时会自动生成。

二、规则的诞生背景

C++11 引入右值引用后,模板/auto推导会产生引用嵌套,例如:

template<typenameT>voidfunc(T&&param){}// 万能引用(Forwarding Reference)

当你传入左值/右值时,编译器会推导出嵌套引用,再触发折叠:

intx=10;func(x);// x 是左值 → T 推导为 int& → T&& = int& && → 折叠为 int&func(10);// 10 是右值 → T 推导为 int → T&& = int&& → 无折叠,保持 int&&

三、最常见场景:万能引用 + 引用折叠

万能引用T&&/auto&&)的核心就是引用折叠,它能完美保留参数的左/右值属性:

1. 模板中的万能引用

template<typenameT>voidforward(T&&val){// T&& 是万能引用,推导后触发引用折叠}inta=5;forward(a);// 传入左值 int → T = int&// 类型:int& && → 折叠为 int&(左值引用)forward(10);// 传入右值 int → T = int// 类型:int&&(无折叠,右值引用)

2. auto 中的万能引用

auto&&x=a;// a 是左值 → auto 推导为 int&// 类型:int& && → 折叠为 int&auto&&y=10;// 10 是右值 → auto 推导为 int// 类型:int&&

四、完整推导示例

我们直接看编译器的推导+折叠全过程:

// 模板函数template<typenameT>voidtest(T&&arg){}// 测试1:传入左值 intintnum=20;test(num);// 推导步骤:// 1. T 推导为 int&// 2. T&& = int& &&// 3. 引用折叠 → int&// 测试2:传入右值 inttest(20);// 推导步骤:// 1. T 推导为 int// 2. T&& = int&&// 3. 无折叠 → int&&

五、关键作用:完美转发(std::forward)

引用折叠是std::forward(完美转发)的底层原理:

  • 它利用引用折叠规则,100% 保留参数的左值/右值属性
  • 让函数参数在传递过程中不丢失值类型,避免不必要的拷贝

示例:

#include<utility>template<typenameT,typename...Args>Tcreate(Args&&...args){// 完美转发:保留 args 的左/右值属性,靠引用折叠实现returnT(std::forward<Args>(args)...);}

六、总结(必背)

  1. 规则:有左则左,双右才右
  2. 触发场景:模板T&&auto&&(万能引用)的类型推导
  3. 核心目的:解决“引用的引用”语法非法问题,实现完美转发
  4. 结果:所有嵌套引用最终只会是&&&两种之一

总结

  1. 引用折叠是编译器自动化简嵌套引用的隐式规则;
  2. 核心口诀:有左则左,双右才右
  3. 它是万能引用和**std::forward完美转发**的底层基础。
http://www.zskr.cn/news/1443643.html

相关文章:

  • 保姆级教程:在ROS Gazebo中为Livox Mid-360激光雷达更换真实3D模型(附Blender缩放技巧)
  • AI驱动智能合约开发:ChatGPT+Truffle+Infura+MetaMask全流程实战
  • 别让大模型把公司机密带出去!企业 RAG 离线隔离与权限硬控制实战
  • 从伯德图斜率到阶跃响应:手把手教你用Matlab分析控制系统,并选择PD、PI还是PID校正
  • Sora 2水印去除技术白皮书(仅限首批内测开发者流通版):基于频域掩码+时序一致性修复的工业级方案
  • 用2针排针自制纽扣电池座:零焊接快速原型供电方案
  • 从PCB布线到天线设计:工程师必懂的微带线实战要点(以ADS/SIwave为例)
  • 2026年特氟龙输送带厂家推荐榜单:铁氟龙耐高温/食品级/防粘/环形/烘干线/耐酸碱输送带品牌精选 - 企业推荐官【官方】
  • 告别Appium!用AirtestIDE搞定安卓自动化测试,从环境配置到脚本录制保姆级指南
  • 广州天河区吊装搬运公司哪家好?2026 口碑 TOP5 推荐 - 从来都是英雄出少年
  • Salt Player完整使用指南:掌握Android本地音乐播放的实用技巧
  • Ubuntu22.04重装显卡驱动
  • 别再只当缓存用了!Hazelcast 5.x 的分布式事件流处理实战
  • 基于Micro:bit与蓝牙的智能穿戴辅助设备:为认知障碍者设计语音报时眼镜
  • YOLOv8n模型转换避坑指南:从PyTorch到ONNX再到TensorRT/RKNN的完整踩坑记录
  • 从病毒到AI:生命定义的边界挑战与多领域应用
  • 2026上海GEO 优化 TOP5 深度评测:90% 企业都踩过的 7 个坑 - 玖叁鹿
  • 2026年天津合同律师选对不吃亏 黄旭强律师领衔5位靠谱推荐 - 本地品牌推荐
  • 神经渲染跨域适应:从合成到真实,引爆下一代数字内容革命
  • IDEA启动太枯燥?试试这10个超酷的ASCII艺术Banner,一键复制就能用
  • 基于Arduino与SIM900A的短信远程控制系统:从原理到实践
  • 京东抢购助手终极指南:3步实现90%成功率的高效秒杀方案
  • 2026 广州番禺区搬运公司收费标准 最新费用明细 - 从来都是英雄出少年
  • 梯度下降算法:从机器学习到人生优化的思维模型
  • 题解:AtCoder AT_awc0080_b Quality Inspection and Product Disposal
  • 2026年 高频焊接机/高频诱导焊接机/全自动高频焊接设备/铜产品焊接设备/制冰机焊接机厂家推荐榜:高精度与智能焊接技术实力全解析 - 企业推荐官【官方】
  • [Full Clock 技术复盘] 一、浏览器前端如何实现百毫秒级时间校准?时间 API 推荐、模拟 NTP 算法原理及局限
  • 华为韬(T)定律
  • Joy-Con Toolkit:Switch手柄终极定制与修复完整指南
  • GetQzonehistory:Python实现QQ空间历史说说完整备份指南