C++11详解(二) -- 引用折叠和完美转发
文章目录
- 2. 右值引用和移动语义
- 2.6 类型分类(实践中没什么用)
- 2.7 引用折叠
- 2.8 完美转发
- 2.9 引用折叠和完美转发的实例
2. 右值引用和移动语义
2.6 类型分类(实践中没什么用)
- C++11以后,进一步对类型进行了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值
- 纯右值是指那些字面值常量或(表达式的返回值)求值结果相当于字面值或是一个不具名的临时对象。如: 42、true、nullptr 或者类似 str.substr(1, 2)、str1 + str2 传值返回函数调用,或者a++,a+b 等。纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价于C++98中的右值
- 将亡值是指返回右值引用的函数的调用表达式和转换为右值引用的转换函数的调用表达(可以是强制类型转换),如move(x)、static_cast<X&&>(x) -> (X&&)x(其实是强制类型转化),左值被强转,左值被move之后变为将亡值
- 泛左值(generalized value,简称glvalue),泛左值包含将亡值和左值
- 有名字就是泛左值,有名字且未被移动的就是左值,有名字且被移动的就是将亡值,没有名字且不可以被移动的就是纯右值,纯右值在实践中可以被移动,比如匿名对象的资源在函数内部被引用属性变为左值,可以转移资源,实践中将亡值和纯右值可以被移动
2.7 引用折叠
1. C++中不能直接定义引用的引用如 int& && r = i; 这样写会直接报错,通过模板或 typedef中的类型操作可以构成引用的引用。
2. 引用折叠的规则:右值引用的右值引用折叠成右值引用,所有其他组合均折叠成左值引用。
3. 像f2函数一样,传左值是左值引用,传右值是右值引用,T&& x参数看起来是右值引用参数,但是由于引用折叠的规则,他传递左值时就是左值引用,传递右值时就是右值引用,这就是万能引用
4. Function(T&& t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,再结合引用折叠规则,就实现了实参是左值,实例化出左值引用版本形参的Function,实参是右值,实例化出右值引用版本形参的Function
5. 搞这么麻烦的东西,其实是为了实现这个万能模版
引用折叠
int main()
{typedef int& lref;typedef int&& rref;int n = 0;// 引用折叠lref& r1 = n; // r1 的类型是 int&lref&& r2 = n; // r2 的类型是 int&rref& r3 = n; // r3 的类型是 int&rref&& r4 = 1; // r4 的类型是 int&&// 右值引用右值引用最终才是右值引用return 0;
}
显示实例化
// 由于引用折叠限定,f1实例化以后总是一个左值引用
template<class T>
void f1(T& x)
{}// 由于引用折叠限定,f2实例化后可以是左值引用,也可以是右值引用
template<class T>
void f2(T&& x)
{}int main()
{int n = 0;// 没有折叠->实例化为void f1(int& x)f1<int>(n);f1<int>(0); // 报错// 折叠->实例化为void f1(int& x)f1<int&>(n);f1<int&>(0); // 报错// 折叠->实例化为void f1(int& x)f1<int&&>(n);f1<int&&>(0); // 报错// 折叠->实例化为void f1(const int& x)f1<const int&>(n);f1<const int&>(0);// 折叠->实例化为void f1(const int& x)f1<const int&&>(n);f1<const int&&>(0);// 没有折叠->实例化为void f2(int&& x)f2<int>(n);// 报错f2<int>(0);// 折叠->实例化为void f2(int& x)f2<int&>(n);f2<int&>(0); // 报错// 折叠->实例化为void f2(int&& x)f2<int&&>(n); // 报错f2<int&&>(0);return 0;
}
万能模版
// 万能引用,传左值是左值,传右值是右值
// 实践中就可以不用写两个模版了
template<class T>
void Function(T&& t)
{int a = 0;T x = a;//x++;cout << &a << endl;cout << &x << endl << endl;
}
const int&& ,虽然在函数内有左值属性,可以修改了,但是在此基础上加了const,就不能修改了,相当于const 左值引用
推导实例化
template<class T>
void Function(T&& t)
{int a = 0;T x = a;//x++;cout << &a << endl;cout << &x << endl << endl;
}int main()
{// 10是右值,推导出T为int,模板实例化为void Function(int&& t)Function(10);// 右值int a;// a是左值,推导出T为int&,引用折叠,模板实例化为void Function(int& t)Function(a);// 左值// std::move(a)是右值,推导出T为int,模板实例化为void Function(int&& t)Function(std::move(a));// 右值const int b = 8;// a是左值,推导出T为const int&,引⽤折叠,模板实例化为void Function(const int&t)// 所以Function内部会编译报错,x不能++Function(b);// const 左值// std::move(b)右值,推导出T为const int,模板实例化为void Function(const int&&t)// 所以Function内部会编译报错,x不能++Function(std::move(b));// const 右值return 0;
}
2.8 完美转发
如果t是左值引用的话,里面的Fun(t)调用的是左值引用,如果t是右值引用,调用的还是左值引用,因为在函数体内右值具有了左值的属性
template<class T>
void Function(T&& t)
{Fun(t);//Fun(forward<T>(t));
}
完美转发可以解决上述的问题
Fun(forward< T >(t)) 中如果,T是int&,会保证t还是是左值属性,如果T是int,会保证t还是右值属性,不会让t的属性退化
底层(强转和特化处理的)是这样处理的:如果是左值属性,就不动,如果是右值属性,就把左值属性强转为右值属性
下面是push_back函数右两个版本的,左值走拷贝构造,右值走移动构造
2.9 引用折叠和完美转发的实例
引用折叠和完美转发的实际作用:
避免了代码的冗余,不用写一份右值引用和一份左值引用的了,直接写成函数模版就非常好
X&& data = T(),因为类模板实例化出了T为string,如果T是string的左值引用给不过去,因为是左值是string&,T是右值的话,可以给过去,右值是string,所以要写成 X&& data,还要写一份强制生成左值和右值的构造
相关文章:
C++11详解(二) -- 引用折叠和完美转发
文章目录 2. 右值引用和移动语义2.6 类型分类(实践中没什么用)2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类(实践中没什么用) C11以后,进一步对类型进行了划分&#x…...
深度学习系列--01.入门
一.深度学习概念 深度学习(Deep Learning)是机器学习的分支,是指使用多层的神经网络进行机器学习的一种手法抖音百科。它学习样本数据的内在规律和表示层次,最终目标是让机器能够像人一样具有分析学习能力,能够识别文字…...
熵采样在分类任务中的应用
熵采样在分类任务中的应用 在机器学习的分类任务里,数据的标注成本常常制约着模型性能的提升。主动学习中的熵采样策略,为解决这一难题提供了新的思路。本文将带你深入了解熵采样在分类任务中的原理、应用及优势。 一、熵采样的原理(优化版) 熵,源于信息论,是对不确定…...
vite配置之---依赖优化选项
vite optimizeDeps 配置项主要在 开发环境 中对依赖项发挥作用 optimizeDeps.entries vite optimizeDeps.entries 是 Vite 配置中的一个选项,用来指定要优化的入口文件。这在开发环境中尤其有用,因为它告诉 Vite 需要预构建哪些文件,以便加速…...
Shell基础:中括号的使用
在Shell脚本中,中括号([ ... ] 和 [[ ... ]])是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法,能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...
oracle ORA-27054报错处理
现象 在oracle执行expdp,rman备份,xtts的时候,由于没有足够的本地空间,只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…...
SpringCloud速通教程
视频地址 文档地址 3. SpringCloud - 快速通关...
MapReduce分区
目录 1. MapReduce分区1.1 哈希分区1.2 自定义分区 2. 成绩分组2.1 Map2.2 Partition2.3 Reduce 3. 代码和结果3.1 pom.xml中依赖配置3.2 工具类util3.3 GroupScores3.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0,详情请参阅 Apache许可证2.0。…...
python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法
回溯算法 「所有可能的结果」,而不是「结果的个数」,一般情况下,我们就知道需要暴力搜索所有的可行解了,可以用「回溯法」。 回溯算法关键在于:不合适就退回上一步。在回溯算法中,递归用于深入到所有可能的分支&…...
JDK 中 NIO 框架设计与实现:深入剖析及实战样例
一、引言 在 Java 的发展历程中,I/O(Input/Output)操作一直是构建高效、稳定应用程序的关键环节。传统的 Java I/O 操作基于流(Stream)的方式,虽然简单易用,但在面对高并发、大规模数据传输等场…...
基于springboot校园点歌系统
基于Spring Boot的校园点歌系统是一种专为校园场景设计的音乐点播平台,它能够丰富学生的校园生活,提升学生的娱乐体验。以下是对该系统的详细介绍: 一、系统背景与意义 在校园环境中,学生们对于音乐有着浓厚的兴趣,传…...
Spring 核心技术解析【纯干货版】- IX:Spring 数据访问模块 Spring-Jdbc 模块精讲
在现代企业级应用中,数据访问层的稳定性和高效性至关重要。为了简化和优化数据库操作,Spring Framework 提供了 Spring-JDBC 模块,旨在通过高度封装的 JDBC 操作,简化开发者的编码负担,减少冗余代码,同时提…...
React开发中箭头函数返回值陷阱的深度解析
React开发中箭头函数返回值陷阱的深度解析 一、箭头函数的隐式返回机制:简洁背后的规则二、块函数体中的显式返回要求:容易被忽视的细节三、真实场景下的案例分析案例1:忘记return导致组件渲染失败案例2:异步操作中的返回值陷阱 四…...
线程同步时定义 std::mutex 为什么要在前面添加 mutable 关键字
在C中,mutable关键字用于修饰类的成员变量,表示即使在一个const对象中,该成员变量也可以被修改。对于mutex这样的同步原语,使用mutable是必要的,原因如下: 1. 为什么需要 mutable? mutex通常用…...
【多线程】线程池核心数到底如何配置?
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...
Linux find 命令 | grep 命令 | 查找 / 列出文件或目录路径 | 示例
注:本文为 “Linux find 命令 | grep 命令使用” 相关文章合辑。 未整理去重。 如何在 Linux 中查找文件 作者: Lewis Cowles 译者: LCTT geekpi | 2018-04-28 07:09 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。 如果你是 W…...
爬楼梯(dp)杭电复试
一个楼梯共有 nn 级台阶,每次可以走一级或者两级或者三级,问从第 00 级台阶走到第 nn 级台阶一共有多少种方案。 输入格式 一个整数 NN。 输出格式 一个整数,表示方案总数。 数据范围 1≤N≤201≤N≤20 输入样例: 4输出样…...
JVM执行引擎
一、执行引擎的概述: 执行引擎是]ava虚拟机核心的组成部分之一; “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则…...
企业四要素如何用PHP进行调用
一、什么是企业四要素? 企业四要素接口是在企业三要素(企业名称、统一社会信用代码、法定代表人姓名)的基础上,增加了一个关键要素,通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…...
基于springboot河南省旅游管理系统
基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统,旨在整合和管理河南省的旅游资源信息,为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍: 一、系统背景与意义 河南省作为中国的中部省份&…...
arm 下 多线程访问同一变量 ,使用原子操作 性能差问题
arm下原子操作性能差的原因 Linux Kernel(armv8-aarch64) 的原子操作的底层实现 - 极术社区 - 连接开发者与智能计算生态 arm 下如何解决 ARMs LSE (for atomics) and MySQL – MySQL On ARM – All you need to know about MySQL (and its variants) on ARM. arm 下lse 和…...
嵌入式工程师必学(143):模拟信号链基础
概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…...
PyQt6/PySide6 的 QDialog 类
QDialog 是 PyQt6 或 PySide6 库中用于创建对话框的类。对话框是一种特殊的窗口,通常用于与用户进行短期交互,如输入信息、显示消息或选择选项等。QDialog 提供了丰富的功能和灵活性,使得开发者可以轻松地创建各种类型的对话框。下面我将详细…...
【AI日记】25.02.05 自由不是一种工具
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Backpack Prediction Challenge感想:这次比赛的数据集的一大特点是信号过弱或者噪声过大,也是一大难点,即使kaggle 官方增加了一…...
【原子工具】快速幂 快速乘
题幂算.一切即1 阴阳迭变积微著,叠浪层峦瞬息功 莫道浮生千万事,元知万象一归宗 文章目录 快速幂原始快速幂(O(logn))二分递归形式非递归形式 模下意义的快速幂(O(logn))二分递归形式非递归形式 快速乘龟速…...
2024年12月 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试
202412 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共10题,共30分) 第 1 题 列表存放全班同学的身高,小猫运行下列程序,下列选项说法正确的是?( &#…...
【面试宝典】机器学习:深度解析高频面试题与解答策略
目录 🍔 机器学习中特征的理解 🍔 机器学习三要素如何理解? 🍔 机器学习中,有哪些特征选择的⼯程⽅法? 🍔 机器学习中的正负样本 🍔 线性分类器与⾮线性分类器的区别及优劣 🍔…...
使用 ElementUI 和 Spring 实现稳定可靠的文件上传和下载功能
前端(ElementUI) 1. 文件上传 使用 el-upload 组件配置上传接口处理上传成功和失败<template><div><el-uploadclass="upload-demo"action="http://your-server-url/upload":on-success="handleSuccess":on-error="handle…...
Linux驱动---字符设备
目录 一、基础简介 1.1、Linux设备驱动分类 1.2、字符设备驱动概念 二、驱动基本构成 2.1、驱动模块的加载和卸载 2.2、添加LICENNSE以及其他信息 三、字符设备驱动开发步骤 3.1、分配主次设备号 3.1.1 主次设备号 3.1.2静态注册设备号 3.1.3动态注册设备号 3.1.4释…...
FastReport.NET控件篇之交叉表控件
认识交叉表 上面是交叉表的原型,关键的三个单元格。 单元格①:用于扩展行数据,譬如打印学生成绩表时,每个学生一行,那么这个地方就是以学生姓名列进行打印。 单元格②:用于扩展列数据,譬如打印…...
构建高效复杂系统的关键:架构与模块详解
目录 一、复杂系统组成 二、接入系统 (Access System) 三、应用系统 (Application System) 四、基础平台 (Foundation Platform) 五、中间件 (Abundant External Middleware) 六、支撑系统 (Supporting System) 七、总结 参考文章 干货分享,感谢您的阅读&am…...
C++之递归
递归 递归函数是指一个函数直接或间接地调用自身。递归函数通常用于解决可以分解为相似子问题的问题,例如计算阶乘、斐波那契数列、遍历树结构等 基本结构 一个递归函数通常包含两个部分: 基准条件(Base Case):这是…...
pushgateway指标聚合问题
一 问题现象 一个job有多个实例推送指标,但是从pushgateway上看这个job的instance字段,只显示一个实例的ip,而不是多个实例。导致在grafana上无法正常根据ip查看监控。 应用的prometheus的配置 management:metrics:tags:application: ${spr…...
mini-lsm通关笔记Week2Day7
项目地址:https://github.com/skyzh/mini-lsm 个人实现地址:https://gitee.com/cnyuyang/mini-lsm 在上一章中,您已经构建了一个完整的基于LSM的存储引擎。在本周末,我们将实现存储引擎的一些简单但重要的优化。欢迎来到Mini-LSM的…...
[权限提升] Windows 提权 维持 — 系统错误配置提权 - 注册表权限配置错误提权
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:注册表权限配置错误提权原理 通常 Windows 中的服务都是以 System 权限运行的,而 Windows 的服务程序的启动路径又是存放在注册表中的,若注册表配置不…...
产品经理的人工智能课 02 - 自然语言处理
产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型(Large Language Models, LLMs)是自然语…...
软件工程导论三级项目报告--《软件工程》课程网站
《软件工程》课程网站 摘要 本文详细介绍了《软件工程》课程网站的设计与实现方案,包括可行性分析、需求分析、总体设计、详细设计、测试用例。首先,通过可行性分析从各方面确认了该工程的可实现性,接着需求分析明确了系统的目标用户群和功能…...
FPGA|IP核PLL调用测试:调用IP核
1、选择tools-》Megawizard plug-In manager 2、选择第一项,下一步 3、选择ATPLL,芯片系列、和输出文件类型,输出文件名称,单击next 4、出现配置PLL界面 5、选择输入时钟频率,单击next 6、生成reset、和locked信号&…...
leetcode_双指针 160.相交链表
160.相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路: 本题中,交点不是数值相等,而是指针相等 双指针遍历两遍后必定相遇,…...
TongSearch3.0.4.0安装和使用指引(by lqw)
文章目录 安装准备手册说明支持的数据类型安装控制台安装单节点(如需集群请跳过这一节)解压和启动开启X-Pack Security和生成p12证书(之后配置内置密码和ssl要用到)配置内置用户密码配置ssl(先配置内置用户密码再配ssl)配置控制台…...
2021.3.1的android studio版本就很好用
使用最新版的studio有个问题就是gradle版本也比较高,这样就容易出现之前项目不兼容问题,配置gradle可能会出现很多问题比较烦,所以干脆就用老版本的studio...
提示词实践总结
目录 一、要求创建SqlServer表(ChatGpt) 二、要求生成多层架构代码(Cursor) 三、要求修改方法返回值类型(Cursor) 四、要求修改方法入参(Cursor) 五、复杂的多表关联生成&#…...
【Elasticsearch】Filters聚合
Filters聚合的基本语法 Filters聚合是一种多桶聚合,用于将文档分组到多个桶中,每个桶对应一个过滤条件。以下是Filters聚合的基本语法和结构: 1.基本结构 json { "aggs": { "<aggregation_name>": { "filter…...
Java基础面试题50题
1,""空字符串的作用 package com.neuedu.nineteen;public class Test {public static void main(String[] args) {String s"";for (char i a; i < d; i) {ssi;//输出abc // sis;//输出cba}System.out.println(s);} }如题所示&…...
Django框架的全面指南:从入门到高级
Django框架的全面指南:从入门到高级 目录 引言Django简介安装与配置创建第一个Django项目Django的MVT架构模型(Model)视图(View)模板(Template)URL路由表单处理用户认证与权限Django Admin高级…...
c++继承
继承的概念和定义 继承的概念 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序员在 保 持原有类特性的基础上进行扩展 ,增加功能,这样产生新的类,称派生类。继承 呈现了面向对象 程序设计的…...
【Linux系统】分页式存储管理
分页式存储管理 1、虚拟地址和页表的由来 思考一下,如果在没有虚拟内存和分页机制的情况下,每一个用户程序在物理内存上所对应的空间必须是连续的,如下图: 因为每一个程序的代码、数据长度都是不一样的,按照这样的映射…...
cmd执行mysql命令
安装mysql之后如果想使用cmd执行mysql命令,需要怎么操作呢,下面一起看一下。 安装mysql之后,如果直接去cmd窗口执行MySQL命令,窗口可能会提示mysql不是可执行命令。 需要配置系统的环境变量,将mysql的安装路径配置系…...
第一天:Linux内核架构、文件系统和进程管理
目录 Linux核心概念学习笔记一、Linux内核架构(一)内核的任务(二)实现策略(三)内核的组成部分(四)内核源文件目录结构二、Linux文件系统(一)文件系统架构(二)虚拟文件系统的数据结构三、Linux进程管理(一)进程相关概念(二)进程的层次结构(三)新进程创建机制(…...
QT:信号和槽
目录 1.概念 2.信号和槽的使用 2.1代码的方式使用 2.1.1.使用connect关联 2.2图形化界面的方式使用 2.2.1使用流程 2.2.2使用名字关联槽函数 3.自定义信号和槽函数 3.1自定义槽函数 3.2自定义信号 4.总结 1.概念 信号和槽是QT特有的一种机制,信号和槽都是…...