如何理解c++中的引用折叠?

2023-11-20

感觉上叫引用坍塌好理解点(reference-collapsing rules)
就这样
A& & 变成 A&
A& && 变成 A&
A&& & 变成 A&
A&& && 变成 A&&
就是左值引用会传染,只有纯右值&& && = &&,沾上一个左值引用就变左值引用了
作者:知乎用户
链接:https://www.zhihu.com/question/40346748/answer/88672920
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

引用折叠的规则上面的各位已经说得很清楚了,我在这里补充下引用折叠是为什么出现的吧。

要说引用折叠,首先得说右值引用(在看这个之前需要了解C++11中左值,右值的概念)。它是C++11出现的新概念,声明类型的方法是:T&&,具体信息可以看下面的代码:

Class A
{
    A()
    {// do something}
};

A GetA()
{
    return A();
}

int main()
{
    A a1 = GetA();   // a1是左值
    A&& a2 = GetA(); // a2是右值引用
    return 0;
}

a1是左值,在构造时使用了GetA() 产生的临时对象,之后GetA()产生的临时对象会销毁。

a2是右值引用,其指向的就是GetA()所产生的对象,这个对象的声明周期是和a2的声明周期是一致的。即少了临时对象,从而省去了临时对象的构造和析构。

由此可见右值引用的好处,在新代码中,右值引用是值得大力使用的。但是,在使用的时候,有例外情况了:T&&并不是一定表示右值,比如,如果它绑定的类型是未知的话,既可能是左值,又可能是右值。比如:


template<typename T>
void f(T&& param);

f(10); // 10是右值
int x = 10;
f(x);  // x是左值

以上这种未定的引用类型(param的类型)称为 universal references,这种类型必须被初始化,而它是左值还是右值则取决于它的初始化,如果被左值初始化,那么它就是左值,反之亦然。那么什么时候是左值,什么时候是右值,就需要进行类型推导才知道。

由于存在T&&这种未定的引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这是经过类型推导的T&&类型,相比右值引用(&&)会发生类型的变化,这种变化就称为引用折叠。(《深入应用C++11-代码优化与工程级应用》 --- 祁宇 P68 )

引用折叠的规则如下(配合@jun-jun的答案)[和上一段的出处一样]:
1.所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&)
2.所有的其他引用类型之间的折叠都将变成左值引用。 (A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&)


以上,才疏学浅,有不明确或不正确的地方,请指正。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何理解c++中的引用折叠? 的相关文章

随机推荐

  • 小程序实现微信登录Java后端(一)--前端实现

    目录 一 概述 二 登录流程 三 前端代码 四 解读前端代码 1 登录部分 2 检查当前用户是否已登录 3 小程序启动时校验登录 五 阶段性小结 一 概述 最近终于有时间去搞一下准备参加比赛的小程序 小程序一开始设计的是使用邮箱登录 老师建
  • 剑指offer——输出数组中k个最小值(快速,冒泡,选择,插入)

    找k个最小值 基本思路是对数组排序 输出前k个或者后k个 我们回顾一下之前的学习过的集中排序方法 快速排序 class Solution def GetLeastNumbers Solution self tinput k def quic
  • rust房屋建造蓝图_妄想山海房子建造攻略

    妄想山海这个游戏的一大特色就是玩家可以在游戏里建造属于自己的房屋 而且这个房屋可不是几个图或是简单的3d模型 而是一个完整的房屋呦 玩家可以创作或是收集来的房屋设计图 真实打造 所以在妄想山海里房子的建造还是要花点功夫的 下面讯喵喵就为大家
  • Redis 分布式缓存

    分布式缓存 单点 Redis 的问题及解决 数据丢失 实现Redis数据持久化 并发能力 搭建主从集群 实现读写分离 存储能力 搭建分片集群 利用插槽机制实现动态扩容 故障恢复能力 利用哨兵机制 实现健康检测和自动恢复 RDB RDB全称R
  • 利用接口请求获取文件

    1 背景 测试阶段文件上传服务器为测试文件服务器 预览时根据id获取的测试服务器文件 但发到线上后发现文件上传到了测试服务器 读取文件时又是从线上的文件服务器读取的 因此导致了文件显示异常 2 数据恢复分析 先从测试环境获取到文件 这些文件
  • 微信小程序图片使用filter将彩色图片变成黑白以后,border-radius失效的解决办法

    使用css的filter将彩色图片亮度降低之后 设置的border radius会出现失效不起作用的情况 需求 用户在线头像为原始的彩色图片 离线将用户头像改为黑白色 原来的写法
  • 【数据结构】并查集

    文章目录 1 并查集原理 2 并查集的实现 2 1并查集框架 2 2insert 插入元素接口 2 3Findroot查找所属集合 2 4合并两个集合 2 5统计集合个数 3 测试 4 并查集OJ 4 1省份的数量 4 2等式方程的可满足性
  • Enterprise Architect 中文经典教程

    本文使用到的EA工程文件下载 一 Enterprise Architect简介 Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件 Computer Aided Software Engineering
  • python从键盘上输入一个字符、当输入的是英文字母时_从键盘输入一个字符 若该字符是英文字母是则输入对应的ASCII码...

    展开全部 ascill字母表 a z 97 122 A Z 65 90 0 9 48 57 代码如下 可以循环判断是字母的ascil 输入636f707962616964757a686964616f313333376261340退出 inc
  • 验证微信号的正则表达式

    var wxreg a zA Z 1 a zA Z0 9 5 19
  • vue项目使用视频播放器vue-video-player

    安装使用 插件有版本限制 如果项目使用的是vue2 0版本 请选择安装 4 x版本 否则会安装不成功 yarn add vue video palyer save 或者 npm install vue video palyer save 组
  • python里出现breakoutsideloop_Python ast.Break方法代码示例

    本文整理汇总了Python中ast Break方法的典型用法代码示例 如果您正苦于以下问题 Python ast Break方法的具体用法 Python ast Break怎么用 Python ast Break使用的例子 那么恭喜您 这里
  • Java对JSON路径解析JsonPath例子

    1 jsonpath的特点 不需要定义java bean 不用对多层map多次迭代 就可以获得json解析树中深层次的节点 Jayway的jsonpath解析需要把要解析的json一次加载进内存 2 1 jsonpath表达式的两种方式 t
  • html创建添加地图(超简单)

    1 打开百度地图创建平台 百度地图创建平台 2 根据个人需求改就行了 可加标注 3 点击获取代码 复制下来就可以用了 4 个人用的是HBulider 复制到里面可直接用了 如果有文字显示问题 把编码改成utf 8就行了 5 地图控件位置在网
  • Unity3d + NGUI 的多分辨率适配

    移动端的多机型适配 现在要介绍的是 锁链战记 这款游戏的适配方法 这种适配方法是UI是一个基础尺寸 背景是一个基础尺寸 背景比UI多出的部分是一些没有实际作用的部分 这样的适配方式避免了在iPhone5这样的小屏幕上镶边 首先设定UIRoo
  • matlab函数式里虚数i怎么表示,matlab虚数_matlab 中复数如何表示?

    matlab 中复数如何表示 你i是不是已经被定义为变量了 正常i就是复数单位 可以这样表示的 matlab是否可以定义虚数 想来想去只想到一个比较笨的办法 不过不用if find和循环语句 而且确实管用 a 1 2 3 3i 2i 1i
  • 在任何地方使用Active Directory映像

    介绍 Introduction Active Directory has a neat feature that enables you to upload user images Unfortunately not all systems
  • 算术转换之寻常算术转换

    算术转换之寻常算术转换 题目 include
  • Python之动态规划

    序言 最近在学习python语言 语言有通用性 此文记录复习动态规划并练习python语言 动态规划 Dynamic Programming 动态规划是运筹学的一个分支 是求解决策过程最优化的过程 20世纪50年代初 美国数学家贝尔曼 R
  • 如何理解c++中的引用折叠?

    感觉上叫引用坍塌好理解点 reference collapsing rules 就这样 A 变成 A A 变成 A A 变成 A A 变成 A 就是左值引用会传染 只有纯右值 沾上一个左值引用就变左值引用了 作者 知乎用户 链接 https