左值右值, 左值引用右值引用,完美转发

一. 左值和右值

左值: 可以取地址的对象
右值: 不可以取地址的对象

double x=1.0, y = 2.0;
1;				// 字面量, 不可取地址, 是右值
x + y;			// 表达式返回值, 不可取地址, 是右值
max(x, y);		// 传值返回函数的返回值 (非引用返回)

总结就是: 根据是否可以取地址来区分是左值还是右值

二.左值引用和右值引用

左值引用: 对左值的引用, 给左值起别名, 主要是为了避免对象拷贝.

int a = 1;
int& la = a;

右值引用: 对右值的引用, 给右值起别名, 主要是为了延长对象的生命周期

int&& ra = 10;

注意, 右值引用变量, 其实是左值, 可以对它取地址和赋值

int x = 1, y = 2;
int&& right_ref = x + y;
cout << right_ref << endl;
right_ref = 10;
cout << right_ref << endl;

2.1 左值引用指向右值 和 右值引用指向左值

左值引用可以指向右值, 需要const来修饰, 这一点在方法里很常用, 比如push_back接口, 并且const修是, 所以即使传进来的是右值, 也没关系.

void test(const int& a)
{cout << a << endl;
}int main() {int a = 1;int&& ra = move(a);test(a);test(ra);
}

右值引用可以指向左值, 需要std::move(v)

int a = 1;
int&& ra = move(a);
cout << ra << endl;
a = 2;
cout << ra << endl;
ra = 3;
cout << a << endl;

三. 左值引用的意义

传参返回值时, 避免对象拷贝, 节省了内存, 提搞了效率

class A
{
public:int _a;A(int a) : _a(a) {};// 返回值时, 避免拷贝A& operator +=(const int& i){_a += i;return *this;}
};// 传参时, 避免拷贝
void test(const A& a)
{cout << a._a << endl;
}int main() {A a(1);test(a);a += 1;test(a);
}

但是在返回值返回左值引用时, 如果返回的是局部变量, 那么除了函数作用域是不行的

class A
{
public:int _a;A(int a) : _a(a) {};A& operator +=(const int& i){A a(_a);// 返回局部变量, 会直接报错return *a;}
};int main() {A a(1);a += 1;
}

四. 右值引用的意义

将一个对象中的资源移动到另一个对象(资源控制权的转移)。
拷贝构造: const左值引用
移动构造: 右值引用
移动赋值: const左值引用, 是运算符重载
用例如下

class A
{
public:int _a;A(int a) : _a(a) {cout << "构造函数" << endl;};A(const A& a){cout << "拷贝构造函数" << endl;_a = a._a;}A(A&& a) noexcept{cout << "移动构造函数" << endl;_a = a._a;}A& operator=(const A& a) noexcept{cout << "移动赋值函数" << endl;_a = a._a;return *this;}
};A test()
{A a(1);cout << &a << endl;// 但是现代编译器中, 这里已经不执行移动构造函数了, 用了更好的优化方式return a;
}int main() {A a = test();cout << &a << endl;A a2 = a;A a3 = std::move(a);A a4(1);a4 = std::move(a3);
}

执行结果
在这里插入图片描述

五. 完美转发

5.1 前提知识

函数模板中的&&不表示右值引用, 而表示万能引用
不完美转发的例子

void f(int& x)
{cout << "左值引用" << endl;
}void f(const int& x)
{cout << "const 左值引用" << endl;
}void f(int&& x)
{cout << "右值引用" << endl;
}void f(const int&& x)
{cout << "const右值引用" << endl;
}template<typename T>
void test(T&& t)
{f(t);
}int main() {int a = 1;test(a);const int b = 1;test(b);test(1);const int d = 1;test(std::move(d));
}

执行结果和我们猜想的差别很大, 是因为, 右值引用本身是左值, 所以在模板函数中, 我们传进去的是右值, 但是等到调用f函数的时候, 已经全部是左值了
在这里插入图片描述

5.2完美转发

由上面的例子我们可以看到, 是一个不完美转发, 因为右值失去了它的右值属性, 于是便提出了完美转发, 核心方法是
std::forward, 它在传参过程中, 保留对象原生类型的属性, 我们稍加修改一下上面的例子

void f(int& x)
{cout << "左值引用" << endl;
}void f(const int& x)
{cout << "const 左值引用" << endl;
}void f(int&& x)
{cout << "右值引用" << endl;
}void f(const int&& x)
{cout << "const右值引用" << endl;
}template<typename T>
void test(T&& t)
{f(std::forward<T>(t));
}int main() {int a = 1;test(a);const int b = 1;test(b);test(1);const int d = 1;test(std::move(d));
}

执行结果和我们预想的一致了
在这里插入图片描述

总结

右值引用是c++11引入的最重要的新特性之一, 配合着移动语义和完美转发, 是的c++程序运行更加高效.

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

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

相关文章

线程池666666

1. 作用 线程池内部维护了多个工作线程&#xff0c;每个工作线程都会去任务队列中拿取任务并执行&#xff0c;当执行完一个任务后不是马上销毁&#xff0c;而是继续保留执行其它任务。显然&#xff0c;线程池提高了多线程的复用率&#xff0c;减少了创建和销毁线程的时间。 2…

Ubuntu开通5005端口 记录

Ubuntu版本&#xff1a;20.04 使用systemctl status firewalld查看防火墙状态&#xff0c;报错Unit firewalld.service could not be found 报错的原因是没有安装firewall&#xff0c;安装命令为sudo apt install firewalld&#xff0c;然后进行安装 安装完成后输入systemctl…

vscode jupyter选择Python环境时找不到我安装的Python

在一些情况下&#xff0c;我们需要自己安装一个Python&#xff0c;在选择内核是可能找不到指定的Python版本&#xff0c; 再次打开内核选择页面就能看到Python环境了 注意先到指定环境下安装依赖包&#xff1a; ./python3 pip install ipykernel notebook jupyter

人工智能-NLP简单知识汇总01

人工智能-NLP简单知识汇总01 1.1自然语言处理的基本概念 自然语言处理难点&#xff1a; 语音歧义句子切分歧义词义歧义结构歧义代指歧义省略歧义语用歧义 总而言之&#xff1a;&#xff01;&#xff01;语言无处不歧义 1.2自然语言处理的基本范式 1.2.1基于规则的方法 通…

[DataWhale大模型应用开发]学习笔记1-尝试搭建向量数据库

1.词向量 1.定义 词向量&#xff08;Word Vector&#xff09;是将单词表示为向量形式的技术&#xff0c;是自然语言处理&#xff08;NLP&#xff09;中的一种常用方法。通过将单词转化为向量&#xff0c;计算机能够更好地理解和处理语言。简单来说&#xff0c;词向量就是将单…

Windows系统安装NVM,实现Node.js多版本管理

目录 一、前言 二、NVM简介 三、准备工作 1、卸载Node 2、创建文件夹 四、下载NVM 五、安装NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表&#xff1b; 4、下载指定版本Node.js 5、使用指定版本Node.js 6、查看已安装Node.js列…

【区块链+基础设施】国家健康医疗大数据科创平台 | FISCO BCOS应用案例

在医疗领域&#xff0c;疾病数据合法合规共享是亟待解决的难题。一方面&#xff0c;当一家医院对患者实施治疗后&#xff0c;若患者转到其 他医院就医&#xff0c;该医院就无法判断诊疗手段是否有效。另一方面&#xff0c;医疗数据属于个人敏感数据&#xff0c;一旦被泄露或被恶…

一个能让渲染性能提高100倍的办法

GPU 光线追踪是当今的热门话题&#xff0c;所以让我们来谈谈它&#xff01;今天我们将光线追踪一个单个球体。 使用片段着色器。 是的&#xff0c;我知道。并不特别花哨。你可以在 Shadertoy 上搜索并获得数百个示例(https://www.shadertoy.com/results?querysphere)。甚至已…

自研直播系统-直播系统实战

文章目录 1 流媒体基础本文教程下载地址1.1 流媒体1.2 流式传输方式1.2.1 顺序流式传输1.2.2 实时流式传输 1.3 流媒体传输协议1.3.1 rtmp协议1.3.2 HLS协议1.3.3 RTSP协议1.3.4 视频流的对比 1.4 视频编码(codec)1.5 分辨率的规范分辨率簡介&#xff1a;1.5.2 分辨率單位 1.6 …

聊聊etsy平台,一个年入百万的项目

聊聊etsy平台&#xff0c;一个年入百万的项目 什么是etsy,这是怎样一个平台&#xff0c;怎样盈利的&#xff1f;相信现在大家满脑子都是这些疑问。 这个平台也是无意间一个学员提到的&#xff0c;据说他朋友靠这个平台年赚好几百万。苦于门槛太高&#xff0c;他也做不了。今天…

重磅发布|WAIC 2024最新活动日程安排完整发布!

WAIC 2024 将于 7 月在上海世博中心和世博展览馆举行&#xff0c;论坛时间为 7 月 4 日至 6 日&#xff0c;展览时间为 7 月 4 日至 7 日。会议涵盖 AI 伦理治理、大模型、具身智能、投融资、教育人才等重点话题&#xff0c;体现 AI 向善等价值导向&#xff0c;9 位大奖得主和 …

Inscription Alliance的Denim协议发行首个聚合跨链铭文BTIA,计划参与Mint注册量达15万

官方消息&#xff0c;由Inscription Alliance自主研发的创新性Denim协议发行首个聚合跨链铭文BTIA&#xff0c;并将于2024年7月19日公开Mint。Denim协议旨在解决当下铭文赛道流动性和互通性不足的痛点&#xff0c;基于该协议搭建的Denim Swap可以实现聚合各项协议和各条公链的彼…

数据结构常见图算法

深度优先搜索 时间复杂度 领接矩阵表示 O( n2) 领接表表示 O(n+e) 空间复杂度 O(e) DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点…

荣耀大横评,睿蓝7-450荣耀版卷出来的性价比之王

手握11万左右预算,如何在市场内选出一辆合适自己的车?荣耀版车型无疑是当下的最佳答案。在众多荣耀版车型中,比亚迪宋PLUS荣耀版EV520km领先型(后统称宋PLUS荣耀版)、比亚迪元PLUS荣耀版430km领先型(后统称元PLUS荣耀版)、比亚迪海豚PLUS荣耀版420km时尚版(后统称海豚荣耀版)、…

【CSAPP】-binarybomb实验

目录 实验目的与要求 实验原理与内容 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 操作异常问题与解决方案 实验总结 实验目的与要求 1. 增强学生对于程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 2. 掌握使用gdb调试器…

Python学习篇:PyCharm的基本使用教程(二)

目录 1 前言 2 创建Python项目 3 创建Python文件 4 编写 Hello World 并运行 5 PyCharm界面简介 1 前言 PyCharm的使用贯穿整个Python的学习&#xff0c;所以单独拿出来出教程不合适&#xff0c;说多了对于新手来说也还是不明白&#xff0c;这里我们先从学习开始前大家需…

【基础算法总结】分治—快排

分治—快排 1.分治2.颜色分类3.排序数组4.数组中的第K个最大元素5.库存管理 III 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.分治 分治…

搜狐新闻HarmonyOS版本 push 推送开发

背景 搜狐新闻作为HarmonyOS的合作伙伴&#xff0c;于2023年12月成功上架鸿蒙单框架应用市场&#xff0c;成为首批鸿蒙应用矩阵的一员。 新闻类推送作为应用的重要组成部分&#xff0c;在二期规划中&#xff0c;我们将推送功能列为核心功能模块。本文将推送集成过程中的步骤和…

JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI

JAVA妇产科专科电子病历系统源码&#xff0c;前端框架&#xff1a;Vue&#xff0c;ElementUI孕产妇健康管理信息管理系统是一种将孕产妇健康管理信息进行集中管理和存储的系统。通过建立该系统&#xff0c;有助于提高孕产妇健康管理的效率和质量&#xff0c;减少医疗事故发生的…

新华三通用大模型算力底座方案:为AI时代注入强大动力

在人工智能技术日新月异的今天&#xff0c;大模型作为推动AI进步的重要驱动力&#xff0c;是百行百业不断追逐的热点。大模型以其强大的泛化能力、卓越的模型效果和广泛的应用场景&#xff0c;正改变着人工智能的未来。作为国内领先的ICT解决方案提供商&#xff0c;新华三集团凭…