C++笔记之引用折叠规则

news2024/11/27 7:40:22

C++笔记之引用折叠规则

文章目录

  • C++笔记之引用折叠规则
    • 1. 当两个左值引用结合在一起时,它们会折叠成一个左值引用。
    • 2. 当一个左值引用和一个右值引用结合在一起时,它们会折叠成一个左值引用。
    • 3. 当两个右值引用结合在一起时,它们也会折叠成一个右值引用。
    • 4. 引用折叠只会在模板参数类型的推导中发生。
    • 5.左值引用和右值引用结合的一些常见情况:

在这里插入图片描述

C++中的引用折叠规则是一种规则,用于确定两个或更多引用类型相互结合时的最终引用类型。引用折叠通常发生在模板参数的推导过程中,特别是在模板元编程和泛型编程中。引用折叠规则的基本原则如下:

X& &, X& &&, X&& & 折叠为:X&
X&& && 折叠为:X&&

1. 当两个左值引用结合在一起时,它们会折叠成一个左值引用。

int a = 42;
int& ref1 = a;
int& ref2 = ref1;  // ref2 仍然是一个左值引用

2. 当一个左值引用和一个右值引用结合在一起时,它们会折叠成一个左值引用。

int a = 42;
int& ref1 = a;
int&& ref2 = std::move(a);
int& ref3 = ref2;  // ref3 是一个左值引用

3. 当两个右值引用结合在一起时,它们也会折叠成一个右值引用。

这种情况比较少见,因为通常不会有两个右值引用同时出现在表达式中。

4. 引用折叠只会在模板参数类型的推导中发生。

在实际的代码中,当使用模板或模板参数进行函数调用时,编译器会应用引用折叠规则。这有助于确保传递给模板的参数的引用性质得到正确的传递。

以下是一个示例,展示了引用折叠规则在模板参数推导中的应用:

template <typename T>
void foo(T&& arg) {
    // 这里的 T&& 会根据传递给 foo 的参数是左值还是右值来进行引用折叠
}

int main() {
    int a = 42;
    foo(a);           // T 被推导为 int&
    foo(123);         // T 被推导为 int&&
}

在这个示例中,foo函数接受一个通用引用参数 T&& arg,而 T 的类型在函数调用时会根据传递的参数类型进行引用折叠。这有助于实现完美转发和泛型编程。

下面将解释为什么在 foo(a) 调用中 T 被推导为 int&

在这个情况下,foo 函数接受一个通用引用 T&& 作为参数。当你调用 foo(a) 时,传递的参数是左值 a,因为 a 是一个具名变量。根据引用折叠规则,在模板参数类型推导时,通用引用 T&& 中的 T 会根据传递的参数类型来进行引用折叠。具体来说:

  1. T&& 中的第一个 && 表示这是一个右值引用。

  2. 传递的参数 a 是一个左值。

根据引用折叠规则,右值引用和左值引用结合时,会产生一个左值引用。因此,T 被推导为 int&,即 T 变成了 int& 类型。

所以,foo(a) 中的 T 被推导为 int&,这意味着 argfoo 函数内部被视为一个左值引用,并且可以修改传递给 foo 的参数 a。这正是通用引用的一个特性,它能够保留传递参数的左值或右值性质。

5.左值引用和右值引用结合的一些常见情况:

在C++中,左值引用和右值引用结合可以创建不同的引用类型,具体取决于它们的组合方式。左值引用通常用来引用左值,而右值引用通常用来引用右值。以下是左值引用和右值引用结合的一些常见情况:

    1. 左值引用引用左值:
    int x = 10;
    int& ref = x; // ref是一个左值引用,引用了一个左值x
    
    1. 右值引用引用右值:
    int&& rref = 20; // rref是一个右值引用,引用了一个右值20
    
    1. 左值引用可以引用右值,但需要使用std::move()来进行转换:
    int y = 30;
    int& ref2 = std::move(y); // 使用std::move将右值引用绑定到左值
    
    1. 右值引用也可以引用左值,但不需要std::move():
    int z = 40;
    int&& rref2 = z; // 右值引用也可以引用左值,但不会转移所有权
    
    1. 结合左值引用和右值引用可以创建重载函数,以根据参数类型选择不同的函数:
    void foo(int& lvalue_ref) {
        // 处理左值
    }
    
    void foo(int&& rvalue_ref) {
        // 处理右值
    }
    
    int a = 50;
    foo(a); // 调用第一个foo,传递左值
    foo(60); // 调用第二个foo,传递右值
    

左值引用和右值引用的结合方式可以用于处理不同的值类型,这是C++中实现重载和改进性能的关键工具。左值引用通常用于引用左值,而右值引用通常用于引用右值,但也可以在特定情况下混合使用它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis学习笔记9 动态SQL

Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景&#xff1a; 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…

CI/CD与DevOps:您需要知道的8个核心区别

CI/CD是一种让程序员能迅速并可靠地更新代码的做法。而DevOps则包括一系列方法和思想&#xff0c;这些让开发和运维的人都能更好地协作&#xff0c;使得整个产品从设计到使用都能更加高效地完成。尽管CI/CD和DevOps都是为了让软件开发更高效&#xff0c;但它们在具体怎么做上有…

苹果mac笔记本部分按键失灵怎么回事?5连option键即可解决

苹果mac部分按键突然失灵怎么办&#xff1f; 使用万能的重启大法&#xff0c;数字键 7,8,9 以及 m 等按键失灵&#xff0c;但是其他按键正常。 使用外接键盘发现是可以正常输入的&#xff0c;难道是笔记本键盘坏了&#xff1f;要去售后维修吗&#xff1f; 苹果mac笔记本部分按…

解决Python中的JSON序列化Bug TypeError: Object of type ‘int64‘ is not JSON serializable

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

9_16搜索练习

填涂颜色 此时的递归是可以停下来的&#xff0c;我们需要做到开工没有回头箭&#xff08;不能让他往回走&#xff09; 此处使用的1标记走过的点&#xff0c;&#xff01;0证明走过&#xff0c;走过就停 #include <bits/stdc.h> using namespace std; int a[32][32],b[32]…

看期权哪个软件更好用?数据比较全面直观的那种?

在介绍期权看盘软件之前&#xff0c;我们先来了解一下期权交易的发展史。2015年&#xff0c;国内首只期权上市交易&#xff0c;2019年深交所期权上市&#xff0c;期权市场越来越火&#xff0c;期权分仓软件也是横空出世发展至今&#xff0c;下文介绍看期权哪个软件更好用&#…

链路聚合和VRRP链路聚合

目录 链路聚合 基本术语 配置链路聚合的条件 手工模式 负载分担 LACP模式 活动链路的选举 LACP模式配置 VRRP VRRP的基本概念 VRRP的定时器 VRRP的主备选举 VRRP主备切换 VRRP抢占模式(Preempt Mode) : VRRP监视上行端口 VRRP和MSTP结合应用 VRRP的基本配置 …

信息安全 科技评估分类

声明 本文是学习GB-T 42776-2023 科技评估分类. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 编码方法 科技评估分类代码由基本分类代码和7个附加分类代码组成&#xff0c;代码结构如图2所示。 图 2 科技评估分类代码结构图 GB/T 42776—2023 …

uniapp——实现base64格式二维码图片生成+保存二维码图片——基础积累

最近在做二维码推广功能&#xff0c;自从2020年下半年到今天&#xff0c;大概有三年没有用过uniapp了&#xff0c;而且我之前用uniapp开发的程序还比较少&#xff0c;因此很多功能都浪费了很多时间去查资料&#xff0c;现在把功能记录一下。 这里写目录标题 效果图1.base64生成…

go语言---锁

什么是锁呢&#xff1f;就是某个协程&#xff08;线程&#xff09;在访问某个资源时先锁住&#xff0c;防止其它协程的访问&#xff0c;等访问完毕解锁后其他协程再来加锁进行访问。这和我们生活中加锁使用公共资源相似&#xff0c;例如&#xff1a;公共卫生间。 死锁 死锁是…

共享股东:一种让连锁门店企业家赚钱的新模式

你是否经营着一家或多家连锁门店&#xff0c;想要提高你的收入和竞争力&#xff1f;你是否想要吸引更多的客户和投资者&#xff0c;让他们成为你的忠实合作伙伴&#xff1f;你是否想要利用互联网的力量&#xff0c;让你的门店变得更加智能和高效&#xff1f;如果你的答案是肯定…

JavaScript速成课—事件处理

目录 一.事件类型 1.窗口事件 2.表单元素事件 3.图像事件 4.键盘事件 5.鼠标事件 二.JavaScript事件处理的基本机制 三.绑定事件的方法 1.DOM元素绑定 2.JavaScript代码绑定事件 3.监听事件函数绑定 四.JavaScript事件的event对象 1.获取event对象 2.鼠标坐标获取…

11、Kubernetes核心技术 - Service

目录 一、概述 二、Endpoint 三、Service资源清单 四、Service 类型 4.1、ClusterIP 4.2、NodePort 4.3、LoadBalancer 4.4、ExternalName 五、Service使用 5.1、ClusterIP 5.1.1、定义Pod资源清单 5.1.2、创建Pod 5.1.3、定义Service资源清单 5.1.4、创建Servic…

面试官:请说说flex布局_番茄出品.md

面试官&#xff1a;请说说flex布局_番茄出品.md start 依然记得当初学习 flex 布局时&#xff0c;用 flex 布局&#xff1a;画麻将。一筒到九筒&#xff0c;应有尽有。但是光和面试官说&#xff0c;我用 flex 布局画过麻将&#xff0c;并没有什么用。面试官问你一个语法&…

Hadoop:YARN、MapReduce、Hive操作

目录 分布式计算概述 YARN概述 YARN架构 核心架构 辅助架构 MapReduce 概述 配置相关文件 提交MapReduce到YARN Hive Hive架构 Hive在VMware部署 Hive的启动 数据库操作 数据表操作 内部表操作 外部表操作 数据加载和导出 数据加载LOAD 数据加载 - INSERT SEL…

生物的神经系统与机器的人工神经网络

生物的神经系统与机器的人工神经网络 文章目录 前言一、人工神经网络二、生物的神经系统三、关系四、相似与区别4.1. 相似&#xff1a;4.2. 区别: 总结 前言 因为本人是学生物的&#xff0c;并且深度学习的核心——人工神经网络与生物的神经系统息息相关&#xff0c;故想要在本…

单片机测量任务运行时间

前言 1.之前是直接看定时器的计数值来粗略估计&#xff0c;可能会存在一些差错&#xff0c;也不够方便&#xff1b;所以做一个比较通用的计算任务运行时间的小Demo。 2.用定时器的计数值查看开始的Tick和结束的Tick&#xff0c;然后定时器每隔1毫秒溢出一次&#xff0c;通过简…

QML 碰到的奇怪问题

text elied属性失效 elied属性就是当Text的文本文字超过Text的宽度时。文字会出现省略的效果。 import QtQuick 2.9 import QtQuick.Window 2.3Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Rectangle{anchors.centerIn: parentwidth: pa…

颜色扩散类dp及其优化:0919T2

http://cplusoj.com/d/senior/p/330 此题前半部分是AGC058B 这是一个颜色扩散类dp&#xff0c;对于这类dp&#xff0c;存在一个性质。 假如一个区间被 i i i 染&#xff0c;一个被 j j j 染&#xff0c;则必然满足 i < j i<j i<j&#xff08;这是下标&#xff09…

基于SSM的智慧城市实验室主页系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…