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

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.mzph.cn/news/86546.shtml

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

相关文章

【网络协议】Http-上

Http请求结构&#xff1a; 结构图1&#xff1a; 实验解析请求报文&#xff1a; 1.在Edge浏览器上输入ip地址端口号文件资源&#xff0c;也就是下图中的120.XX.139.29:8888/A/B/c.html 2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1)&#xff0c;如下 GET …

Python机器学习实战-特征重要性分析方法(1):排列重要性(附源码和实现效果)

实现功能 排列重要性 PermutationImportance&#xff1a;该方法会随机排列每个特征的值&#xff0c;然后监控模型性能下降的程度。如果获得了更大的下降意味着特征更重要 实现代码 from sklearn.datasets import load_breast_cancer from sklearn.ensemble import RandomFore…

C语言之字符函数字符串函数篇(2)

目录 字符串查找 strstr strstr的使用 strstr的模拟实现 分析 考虑点 代码 strt strtok的使用 循环改进 错误信息报告 strerror 错误码的错误信息 strerror的使用 perror 字符操作 字符分类函数 字符转化函数 今天我们接着讲字符串函数&#xff0c;也…

balenaEtcher格式化的U盘恢复原来样子

今天用balenaEtcher烧录了U盘&#xff0c;刷机N1盒子openwrt, 刷完机结果发现自己的U盘电脑最后只有167M 想要恢复原来的64G以下是方法&#xff0c;使用win10系统 1、打开命令行cmd&#xff08;winr打开运行&#xff0c;在其中输入cmd就可以打开&#xff09;&#xff1b; 2…

C++QT day11

绘制时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent>//绘制事件类 #include <QDebug>//信息调试类 #include <QPainter>//画家类 #include <QTimer>//定时器类 #include <QTime> #include &…

Android---打开相机拍照

简单实现打开系统系统相机拍一张图片并显示在UI上&#xff0c;适用与个人主页头像的切换。 1. 添加权限。AndroidManifest.xml里添加使用相机的权限。 <uses-permission android:name"android.permission.CAMERA"/> 2. 布局。布局内容比较交单&#xff0c;一…

leetcode21合并两个有序链表

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

智慧农业农场小程序源码 智慧农场系统源码

智慧农业农场小程序源码 智慧农场系统源码 一、 智慧农场系统的组成 智慧农场系统一般包括传感器、控制器、数据采集与处理平台、应用软件等组成部分。其中, 传感器主要用于采集土壤温度、湿度、光照强度等环境参数,以及作物生长状态、水肥情况等生产信息。控制器则根据传感器…

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…

你写过的最蠢的代码是?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Parseval’s Theorem Parseval’s Identity of Fourier Transform

https://www.tutorialspoint.com/parseval-s-theorem-and-parseval-s-identity-of-fourier-transform

最新AI创作系统+ChatGPT网站源码+支持GPT4.0+支持ai绘画+支持国内全AI模型

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

Unity引擎更新收费模式:从收入分成转向游戏安装量,将会有哪些影响呢

一、前言 Unity 引擎宣布自 2024 年 1 月 1 日起&#xff0c;将根据游戏安装量对开发者进行收费。官网通知如下 收费模式如图 这张图的大致意思就是&#xff0c; 从2024年1月1日开始&#xff0c;Unity将对所有达标的用户&#xff08;开发者&#xff09;根据游戏安装量征收“安…

ARM Linux DIY(十三)Qt5 移植

前言 板子带有屏幕&#xff0c;那当然要设计一下 GUI&#xff0c;对 Qt5 比较熟悉&#xff0c;那就移植它吧。 移植 Qt5 buildroot 使能 Qt5&#xff0c;这里我们只开启核心功能 gui module --> widgets module 编译 $ make ODIY_V3S/ qt5base编译报错&#xff1a;找不…

Windows11系统C盘用户文件夹下用户文件夹为中文,解决方案

说明&#xff1a; 1. 博主电脑为Windows11操作系统&#xff0c;亲测有效&#xff0c;修改后无任何影响&#xff0c;软件都可以正常运行&#xff01; 2. Windows10系统还不知道可不可行&#xff0c;因为Windows11的计算机管理中没有本地用户和组&#xff0c;博主在csdn上看到很…

【斗罗2】霍雨浩实力被否定,超级斗罗眼光被嘲,魂导院成功捡漏

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 最新一集《绝世唐门》已经更新&#xff0c;相信不少小伙伴和小郑一样都已经先睹为快&#xff0c;本集虽然是过渡剧情&#xff0c;但本身还是有不少有意思的剧情&#xff0c;作为过渡文戏也算是可圈可…

网工基础知识——以太网

1972年Bob Metcalfe“以太网之父”被Xerox雇佣为网络专家&#xff0c;Bob Metcalfe 来到Xerox公司的Palo Alto研究中心&#xff08;PARC&#xff09;的第一个任务是把Palo Alto的计算机连接到ARPANET&#xff08;Internet的前身&#xff09;上。1972年底Bob Metcalfe以ALOHA系统…

修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像

大家都知道Maven默认连接的仓库位置https://repo .maven.apache.org/maven2访问国外镜像下载东西时相对较慢&#xff0c;所以多数朋友想切换到国内镜像&#xff0c;国内阿里已经给大家提供了一套完整的镜像供大家使用。 Maven默认连接的仓库位置 <repositories><repos…

【1++的Linux】之进程(三)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程地址空间&#xff1f;二&#xff0c;进程地址空间是怎么设计的&#xff1f;三&#xff0c;为什么要有进程地址空间&#xff1f; 一&#xff0c;什…