全面理解-c++11的引用折叠
在 C++ 中,引用折叠(Reference Collapsing) 是一组用于处理多重引用(如 T& &
或 T&& &&
)的规则,主要出现在模板参数推导、auto
类型推导和 decltype
的上下文中。它是实现**通用引用(Universal Reference)和完美转发(Perfect Forwarding)**的关键机制。
引用折叠的规则
C++ 标准规定,当出现多重引用时,编译器会将其折叠为单一引用,规则如下:
多重引用组合 | 折叠后的类型 |
---|---|
T& & | T& (左值引用) |
T& && | T& (左值引用) |
T&& & | T& (左值引用) |
T&& && | T&& (右值引用) |
简而言之:
-
只要存在左值引用(
&
),最终结果就是左值引用。 -
只有全是右值引用(
&&
)时,结果才是右值引用。
引用折叠的应用场景
1. 模板参数推导与通用引用
在模板参数推导中,T&&
可能被推导为左值引用或右值引用,具体取决于传入的实参:
-
如果传入左值,
T
被推导为T&
→T&&
折叠为T&
。 -
如果传入右值,
T
被推导为T
→T&&
保持为T&&
。
这种 T&&
被称为通用引用(Universal Reference)。
示例
template<typename T>
void func(T&& arg) { // arg 可能是左值引用或右值引用
}int main() {int x = 10;func(x); // x 是左值 → T 推导为 int& → arg 类型为 int& && → 折叠为 int&func(20); // 20 是右值 → T 推导为 int → arg 类型为 int&&
}
2. auto
类型推导
auto&&
的推导规则与模板参数推导类似,也会发生引用折叠:
int x = 10;
auto&& a = x; // a 是 int&(左值引用)
auto&& b = 20; // b 是 int&&(右值引用)
3. typedef
或 using
别名
在类型别名中,引用折叠也会生效:
template<typename T>
using Ref = T&&;int n = 10;
Ref<int&> r = n; // Ref<int&> → int& && → 折叠为 int&
4. decltype
类型推导
decltype
的结果可能包含引用,进一步参与折叠:
int x = 10;
decltype((x)) y = x; // (x) 是左值 → decltype((x)) 是 int&
引用折叠与完美转发
引用折叠是实现**完美转发(Perfect Forwarding)**的核心机制。通过结合 std::forward
,可以将参数的值类别(左值/右值)无损地转发给其他函数。
示例
template<typename T>
void wrapper(T&& arg) {// 完美转发:保留 arg 的原始值类别(左值/右值)target(std::forward<T>(arg));
}void target(int& x) { std::cout << "左值引用\n"; }
void target(int&& x) { std::cout << "右值引用\n"; }int main() {int x = 10;wrapper(x); // 调用 target(int&)wrapper(20); // 调用 target(int&&)
}
-
std::forward<T>(arg)
的实现依赖于引用折叠:template<typename T> T&& forward(std::remove_reference_t<T>& t) noexcept {return static_cast<T&&>(t); // 引用折叠在此发生 }
引用折叠的必要性
在 C++11 引入右值引用之前,引用的引用(如 int& &
)是语法错误。为了支持模板和完美转发,C++11 引入了引用折叠规则:
-
允许在模板推导中隐式生成多重引用。
-
通过折叠规则解决多重引用的合法性。
总结
场景 | 规则 |
---|---|
模板参数推导 | T&& 可能是左值引用或右值引用(通用引用) |
auto&& | 类似模板推导,支持左值或右值引用 |
完美转发 | std::forward 利用引用折叠保留参数值类别 |
类型别名 | using 或 typedef 中可能触发引用折叠 |
引用折叠是 C++11 中实现现代模板编程的关键机制,尤其在通用引用和完美转发中扮演核心角色。理解它可以帮助你更好地掌握移动语义和高效资源管理。
相关文章:

全面理解-c++11的引用折叠
在 C 中,引用折叠(Reference Collapsing) 是一组用于处理多重引用(如 T& & 或 T&& &&)的规则,主要出现在模板参数推导、auto 类型推导和 decltype 的上下文中。它是实现**通用引用…...

考研高数复习规范
前言 这里记录我的高数复习规范与规划,希望能给需要考研的同学一点启发 规范原因 高数的内容很多,关键的是:会做题、拿高分首先最重要的就是抓住概念。比如有界无界的概念,间断点的概念、极限的概念其次是做题过程中得到的方法…...

2025 docker可视化管理面板DPanel的安装
1.什么是 DPanel ? DPanel 是一款 Docker 可视化管理面板,旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能,使用户能够更轻松地管理和部署 Docker 环境。 软件特点: 可视化管理:提供直观的用户界面&#…...

「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...

Python函数进阶250215
函数返回值进阶 函数返回的内容也是地址 def func01():data [1, 2, 3]# 执行到此步后,[1, 2, 3]这块内存会有一个引用计数器,且值为2,因为内部的data与外部的v1都指向这块空间return data v1 func01()# v1 point the address of data, if…...

VMware Workstation Pro 下载(无需注册账号)
VMware Workstation Pro 目前对个人用户完全免费。有两种下载方式,分别为 1、Broadcom 官网下载 需要注册账号,我懒得注册 2、VMware 更新服务器下载 如果不想注册账号,可以通过 VMware 更新服务器直接下载。访问以下链接: ht…...

USB2.03.0摄像头区分UVC相机在linux中的常用命令
这里是引用 一. USB2.0 & 3.0接口支持区分 1.1. 颜色判断 USB接口的颜色并不是判断版本的可靠标准,但根据行业常见规范分析如下: USB接口颜色与版本对照表: 接口颜色常见版本内部触点数量传输速度黑色USB2.04触点480 Mbps (60 MB/s)白…...

Linux入侵检查流程
1. 初步信息收集 1.1 系统信息 • 目的:了解当前系统的基本情况,包括操作系统版本、内核版本等。 • 命令: # 查看操作系统发行版信息 cat /etc/os-release # 查看内核版本 uname -r 1.2 网络信息 • 目的:查看网络连接状态、…...

(尚硅谷 Java 学习 B 站大学版)Day17 多态练习
Instanceof 关键字 一:引言 不能调用子类特有的方法、属性; 如何才能调用子类特有的属性和方法 向下转型:使用强制类型转换符 Man m1(Man) p2 注:其中p2 为 Person 类型 使用强转时,可能出现 ClassCastException …...

vscode配置django环境并创建django项目(全图文操作)
文章目录 创建项目工作路径下载python插件:创建虚拟环境 1. 命令方式创建2. 图文方式创建 在虚拟环境中安装Django创建Django项目安装Django插件选择虚拟环境 创建项目工作路径 输入 code . 下载python插件: 创建虚拟环境 1. 命令方式创建 切换在工作…...

NLP 八股 DAY1:BERT
BERT全称:Pre-training of deep bidirectional transformers for language understanding,即深度双向Transformer。 模型训练时的两个任务是预测句⼦中被掩盖的词以及判断输⼊的两个句⼦是不是上下句。在预训练 好的BERT模型后⾯根据特定任务加上相应的⽹…...

53倍性能提升!TiDB 全局索引如何优化分区表查询?
作者: Defined2014 原文来源: https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中,全局索引是一种定义在分区表上的索引类型,它允许索引分区与表分区之间建立一对多的映射关系,即一个索引分区可以对…...

基于单片机的常规肺活量SVC简单计算
常规肺活量 SVC(Slow Vital Capacity)是指尽力吸气后缓慢而又完全呼出的最大气量。 成年男性的肺活量通常在 3500-4000ml 之间,成年女性的肺活量通常在 2500-3000ml 之间。 单片机一般通过外接流量传感器,使用ADC高速采集的方式…...

html 点击弹出视频弹窗
一、效果: 点击视频按钮后,弹出弹窗 播放视频 二、代码 <div class="index_change_video" data-video-src="</...

机器学习:二分类和多分类
1. 二分类(Binary Classification) 定义 二分类是指将输入样本分成两个互斥的类别。例如: 邮件 spam 或不是 spam。病人是有病或健康。物品是正品或假货。实现方法 二分类任务可以通过多种算法实现,包括: 逻辑回归(Logistic Regression):通过sigmoid函数将输出值映射…...

Win11配置wsl、ubuntu、docker
系统要求 安装WSL。 开通虚拟化: 准备工作 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartwsl --set-default-versi…...

机试题——稀疏存储
题目描述 在虚拟化技术、芯片仿真器等领域,存在一种场景,即实际读写的数据量比较小,但要求可访问的地址空间却很大(要求 4GB、甚至 128GB 地址空间)。 实现一个地址范围为 32G的,可在该地址范围内任意位置…...

双指针专题1:有效三角形的个数
描述 给定一个正整数n,输入一行包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 输入描述 第一行输入一个正整数n 第二行输入n个nums[i] 输出描述 输出其中可以组成三角形三条边的三元组个数。 解释一个样例: 4…...

Ansible内置模块之file
ansible.builtin.file 模块用于管理文件和目录的属性。可以创建、删除文件或目录,修改文件权限、所有者等属性。 1. 选 项 说 明 选项必须类型默认值说明path是str无要管理的文件或目录的路径state否str无状态或类型。可为 file,directory,absent,link 等mode否str…...

DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

手写一个Java Android Binder服务及源码分析
手写一个Java Android Binder服务及源码分析 前言一、Java语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.aidl3.2 IHelloService.java(自动生成)3.3 HelloService.java…...

考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)
目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统: 操作系统是指控制和管理整个计算机系统的软硬件资源&…...

java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
Tomcat 屏蔽错误信息。java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p&…...

ros:ur机械臂初识
这是用来可视化的launch文件 比如,我运行 roslaunch ur_description view_ur3.launch ur3模型 ur3e模型 ur5模型 ur5e模型 ur10模型 ur20模型 ur30模型 后来我搜了一下 UR5 和 UR10 都是由 Universal Robots(简称 UR)生产的协作机器人&…...

计算机视觉-局部特征
一、局部特征 1.1全景拼接 先用RANSAC估计出变换,就可以拼接两张图片 ①提取特征 ②匹配特征 ③拼接图像 1.2 点的特征 怎么找到对应点?(才能做点对应关系RANSAC) :特征检测 我们希望找到的点具有的特征有什么特…...

LabVIEW袜品压力测试系统
开发了一种基于LabVIEW开发的袜品压力测试系统。该系统利用LabVIEW并结合灵敏的传感器和高精度的处理模块,实现了对袜品压力的精确测量和分析。系统不同于传统的服装压力测试方法,为研究和评价袜子的舒适性提供了新的测试手段。 项目背景 该系统的…...

Node.js 工具模块
Node.js 工具模块 引言 Node.js 是一个开源的、基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 编写服务器端代码,从而构建快速、可扩展的网络应用。在 Node.js 开发过程中,工具模块扮演着至关重要的角色。本文将详细介绍 Node.js 中常用的工具…...

【Redis】下载安装Redis和Redis图形化界面工具教程(2024最新版本,史上最详细)
目录 一、Redis简介 二、Redis下载和安装 2.1、下载 2.2、安装 2.3、环境变量配置(可省略) 三、Redis启动验证 3.1、点击键盘上的WinR键,在跳出的运行界面中输入cmd并确定 3.2、输入redis-cli -v 查看redis的版本号 3.3、接着我们再…...

企业SSL 证书管理指南
文章从以下几个部分展开 SSL证书的用途和使用场景SSL证书的申请类型和实现方式SSL证书的管理SSL证书的续签 一、SSL 证书的用途和使用场景 1.1 为什么要使用 SSL 证书? 1. 数据安全 🛡️- 在 HTTP 传输中,TCP 包可以被截获,攻…...

JDK1.8新特性面试题
lambda表达式 Lambda表达式极大地简化了匿名内部类的创建,促进了函数式编程风格。开发者可以更简洁地定义只有一行代码的函数对象,并将其作为参数传递给方法或者赋值给变量。 三要素: 形式参数、箭头、代码块 (形式参数…...

floodfill算法系列一>太平洋大西洋水流问题
目录 题目方法解析:代码设计:代码呈现: 题目方法解析: 代码设计: 代码呈现: class Solution {int m,n;int[] dx {0,0,-1,1};int[] dy {-1,1,0,0};public List<List<Integer>> pacificAtlant…...

【信息学奥赛一本通 C++题解】1258:【例9.2】数字金字塔
信息学奥赛一本通(C版)在线评测系统 基础算法 第一节 动态规划的基本模型 1258:【例9.2】数字金字塔 小学生的课堂讲解 一、解题思路 同学们,今天我们要解决的是数字金字塔找最大路径和的问题。想象一下,数字金字塔就…...

初始c语言(指针和结构体)
前言: 内容: 昨天学的指针,今天复习指针,然后学习结构体 复习: 什么是指针,指针就是地址, int* p &a; p就是指针变量,但是口语一般成为指针 int 说明p指向的对象是in…...

C#(Winform)通过添加AForge添加并使用系统摄像机
先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型,并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...

Ubuntu安装geteck/jetlinks实战:源码启动
这个还是很复杂的,建议使用docker即可。 参考 使用源码启动JetLinks | JetLinks 物联网基础平台 安装Ubuntu虚拟机(略)安装JDK8编译Redis安装mysql ubuntu安装MySqL server-CSDN博客 初次使用,不要安装ElasticSearch下载源码…...

探索ELK 的魅力
在大数据时代,海量日志和数据的收集、存储、处理与可视化分析变得越来越重要。而 ELK 堆栈,由 Elasticsearch、Logstash、Beats 和 Kibana 组成,正是一个强大的开源解决方案,帮助开发者和运维人员高效管理和分析日志数据。本文将详…...

137,【4】 buuctf web [SCTF2019]Flag Shop
进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...

变相提高大模型上下文长度-RAG文档压缩-2.带早停机制的map-refine
我试过用map-refine方法来精炼上下文,由于它是线性的,运行时间随着文档数量线性增长。所以可以考虑通过判断上下文是否可以满足QA来提前结束过程。 import os import json from langchain_core.documents import Documentdata [] file_path ./data/da…...

C++ 虚表(Vtable)和虚基表(Vbtale)与 虚函数 和 虚继承
C的虚表(Vtable)和虚基表(Vbtale)是与 虚函数 和 虚继承 密切相关的概念。它们都是用于支持多态(特别是动态绑定)和虚拟继承的机制,但它们的作用和实现方式有所不同。我们将逐步探讨虚表、虚基表…...

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序
2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现: 一、背景 UWB(Ultra-Wideband)技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一种无需任何载波,通过发送纳秒…...

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...

草图绘制技巧
1、点击菜单栏文件–》新建–》左下角高级新手切换–》零件; 2、槽口:直槽口,中心点槽口,三点源槽口,中心点圆弧槽口; 3、草图的约束:需要按住ctrl键,选中两个草图,然后…...

机器学习-1:线性回归
常用的线性回归模型主要有以下这些 简单线性回归多元线性回归多项式回归岭回归套索回归弹性网络回归逐步回归 一.简单的一元线性回归 1.导入必备的库 #导入必备的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …...

android 的抓包工具
charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求: 1.启动代理: 2.设置设备端口 3.手机连接当前代理 …...

AJAX 与 ASP 的深入探讨
AJAX 与 ASP 的深入探讨 引言 随着互联网技术的飞速发展,Web应用程序的交互性和性能要求越来越高。AJAX(Asynchronous JavaScript and XML)和ASP(Active Server Pages)作为两种重要的Web开发技术,在提高Web应用程序性能和用户体验方面发挥着重要作用。本文将深入探讨AJ…...

Qt开发①Qt的概念+发展+优点+应用+使用
目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史: 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点: 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…...

函数调用过程的详细解析
目录 一、C语言示例代码 二、汇编代码分步解析(x86架构) 1. 调用前:参数压栈(从右向左) 2. 进入被调函数:保存栈帧 3. 执行函数逻辑 4. 恢复栈帧并返回 三、内存布局图示(调用过程中栈的变…...

教师管理系统在职校中的应用与优势
随着信息技术的不断发展,教师管理系统在职校中的应用越来越广泛。这一系统通过集成教师信息、教学资源和日程安排等功能,为职校管理带来了诸多便利和优势。 教师管理系统能够显著提高管理效率。传统的人工管理方式往往繁琐且易出错,而教师管理…...

【系统架构设计师】虚拟机体系结构风格
目录 1. 说明2. 解释器体系结构风格3. 规则系统体系结构风格4. 例题4.1 例题1 1. 说明 1.p263。2.虚拟机体系结构风格的基本思想是人为构建一个运行环境,在这个环境之上,可以解析与运行自定义的一些语言,这样来增加架构的灵活性。3.虚拟机体…...

UE C++ UObject 功能的初步总结
一. Uboject的 1.垃圾回收:上篇文章介绍过 2.引用更新 1. 反射:之前的文章描述过的CDO,还有就是C与蓝图相互调用UFUCTION,UPROPERTY 2.序列化:编辑器的资产序列化到磁盘上,变为.uasset等格式的资产文件。所有的东西存在编辑器里ÿ…...