2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

news2024/9/27 7:24:42

目录

  • 前言
  • C++左值和右值
  • 二、右值引用
  • 二、右值引用



前言

对于C++的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接在这,话不多说讲解一下
文章链接


C++左值和右值

在 C++ 或者 C 语言中,一个表达式(可以是字面量、变量、对象、函数的返回值等)根据其使用场景不同,分为左值表达式右值表达式。确切的说 C++ 中左值和右值的概念是从 C 语言继承过来的。

左值的英文简写为“lvalue”,右值的英文简写为“rvalue”。很多人认为它们分别是"left value"、“right value” 的缩写,其实不然。lvalue 是“loactor value”的缩写,可意为存储在内存中、有明确存储地址(可寻址)的数据,而 rvalue 译为 “read value”,指的是那些可以提供数据值的数据(不一定可以寻址,例如存储于寄存器中的数据)。

判断某个表达式是左值还是右值的方法:

① 可位于赋值号(=)左侧的表达式就是左值;反之,只能位于赋值号右侧的表达式就是右值。

int a = 5;
5 = a; //错误,5 不能为左值
 
/*
其中a是一个左值,字面值5是一个右值
*/

【注意】 C++中的左值也可以当作右值使用。

int b = 10; // b 是一个左值
a = b; // a、b 都是左值,只不过将 b 可以当做右值使用

② 有名称的、可以获取到存储地址的表达式即为左值;反之则是右值。

上述示例中变量 a、b 是变量名且通过 &a 和 &b 可以获得他们的存储地址,因此 a 和 b 都是左值;反之,字面量 5、10,它们既没有名称,也无法获取其存储地址(字面量通常存储在寄存器中,或者和代码存储在一起),因此 5、10 都是右值。


二、右值引用

1.右值引用的引入

在C++11之前就有引用“&”,但是此种引用有一个缺陷,即正常情况下只能操作 C++ 中的左值,无法对右值添加引用。

int num = 10;
int &b = num; //正确
int &c = 10; //错误

在这里插入图片描述
编译器允许我们为 num 左值建立一个引用,但不可以为 10 这个右值建立引用。

“&”表示的引用又称为左值引用。

【注意】虽然 C++98/03 标准不支持为右值建立非常量左值引用,但允许使用常量左值引用操作右值。也就是说,常量左值引用既可以操作左值,也可以操作右值。

int num = 10;
const int &b = num;
const int &c = 10;

右值往往是没有名称的,因此要使用它只能借助引用的方式。这就产生一个问题,实际开发中我们可能需要对右值进行修改(实现移动语义时就需要),显然左值引用的方式是行不通的。

为此,C++11 标准新引入了另一种引用方式,称为右值引用,用 “&&” 表示。

2.右值引用的使用
① 和声明左值引用一样,右值引用也必须立即进行初始化操作,且只能使用右值进行初始化。

int num = 10;
//int && a = num;  //右值引用不能初始化为左值
int && a = 10;

② 右值引用可以修改右值

int && a = 10;
a = 11;
cout << a << endl;   //输出结果为11

③C++语法之词定义常量右值引用

const int&& a = 10;//编译器不会报错

但这种形式的右值引用并没有实际用处。一方面,右值引用主要用于移动语义和完美转发,其中前者需要有修改右值的权限;其次,常量右值引用的作用就是引用一个不可修改的右值,这项工作完全可以交给常量左值引用完成。

【总结】

①非常量左值引用可以引用的值的类型只有非常量左值,常量左值引用非常量左值、常量左值及右值

	int num = 10;
	int& a = num;	//编译成功,非常量左值引用支持引用非常量左值
	const int num2 = 100;
	int& b = num2;	//编译失败,非常量左值引用不支持引用常量左值
	int& c = 10;	//编译失败,非常量左值引用不支持引用右值
 
	const int& d = num;		//编译成功,常量左值引用支持引用非常量左值
	const int& e = num2;	//编译成功,常量左值引用支持引用常量左值
	const int& f = 100;		//编译成功,常量左值引用支持引用右值

②右值引用不支持引用左值;非常量右值引用可以引用的值的类型只有非常量右值,常量右值引用非常量右值、常量右值

	int num = 10;
	const int num2 = 100;
	int&& a = num;	//编译失败,非常量右值引用不支持引用非常量左值
	int&& b = num2;	//编译失败,非常量右值引用不支持引用常量左值
	int&& c =10;	//编译成功,非常量右值引用支持引用非常量右值
	const int&& d = num;	//编译失败,常量右值引用不支持引用非常量左值
	const int&& e = num2;	//编译失败,常量右值引用不支持引用常量左值
	const int&& f = 100;	//编译成功,常量右值引用支持引用右值

二、右值引用

move()函数的语法格式:

move(arg)
//agr:左值对象,该函数返回arg对象的右值形式
	int num = 10;
	int&& a = std::move(num);  //编译成功
	cout << a << endl;   //输出结果为10;

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

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

相关文章

C++ ,JNI, Java 数据传递全解(一)

在讲正题之前&#xff0c;先说一下C&#xff0c;JNI和Java 对应的数据类型对比吧&#xff0c;废话不多说&#xff0c;直接上图上面为C&#xff0c;Java&#xff0c;JNI 三者只见对应的数据类型好了&#xff0c;现在我们有了上面的数据类型比对&#xff0c;下面就讲讲从C如何将数…

MySQL的下载及安装详细教程

提示&#xff1a;本文仅为MySQL初学者的安装MySQL过程提供参考&#xff0c;创作不易&#xff0c;请多点赞支持&#xff01; MySQL的下载及安装前言一、MySQL的下载及安装1.MySQL的下载2.MySQL的安装3.配置环境变量4.连接MySQL4.1 方式一4.2 方式二前言 本文内容主要是帮助初学…

OpenWrt 制作软件包05

文章目录 OpenWrt 制作软件包05软件包目录结构分析软件包顶层Makefile分析OpenWrt一些常用的变量一些默认的变量Package宏定义Build宏定义构建自己的软件系统软件包工程目录文件内容分析编译安装卸载OpenWrt 制作软件包05 软件包目录结构分析 如下图所示 :

4N65-ASEMI高压MOS管4N65

编辑-Z 4N65在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为2.5Ω&#xff0c;是一款N沟道高压MOS管。4N65的最大脉冲正向电流ISM为16A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。4N65功耗&#xff08…

[工控自动化]信捷PLC与威纶通HMI以太网通讯的连接设置

在工业自动化领域,PLC和触摸屏是经常使用的元器件,其中PLC是处理逻辑与数据的核心,而触摸屏HMI则是显示与操作的必备。 工控领域虽然是外国品牌的天下,但近些年来,国产PLC和HMI品牌也在成长,例如汇川、信捷、威纶通等。 本文以实际使用经验,介绍一下信捷PLC与威纶通HMI的…

java实用小技巧:判断list是否有重复项

在项目中经常会遇到这样的场景&#xff0c;就是一个list&#xff0c;根据某种规则&#xff0c;我要去判断里面是不是有重复的项。 难度不高&#xff0c;但有点烦&#xff0c;所以专门开一篇文章来记录一下&#xff0c;争取弄一个相对简洁的写法。 先看一个简单的例子&#xf…

DSF深度搜索时到底是如何回溯的(小tip)

这一段让我迷了两次&#xff0c;为什么回溯的时候&#xff0c;恢复了最后一位&#xff0c;往上递归一层之后&#xff0c;把最后一位填在它前一位&#xff0c;但是原本的前一位没有恢复&#xff0c;最后一位要怎么办&#xff1f;其实这还是递归没明白 也就是这一步是如何实现的 …

Kafka 压缩算法

压缩 (compression) : 用时间换空间的思想 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输 Kafka 消息分两层&#xff1a; 消息日志组成 : n 个消息集合消息集合 (message set) 组成 : n 条日志项 (record item)日志项封装了消息 (message)Kafka 在消息集合层上进行写入…

python趣味编程-奥赛罗游戏

在上一期我们用Python实现了一个高速公路汽车游戏的游戏&#xff0c;这一期我们继续使用Python实现一个简单的奥赛罗游戏&#xff0c;让我们开始今天的旅程吧~ 在Python中使用Turtle实现的奥赛罗游戏 在Python中使用Turtle的简单奥赛罗游戏 是一个以 Python 为程序设计语言的项…

基于nvidia xavier智能车辆自动驾驶域控制器设计与实现(一)

智能车辆在减少交通事故、节能减排、缓解交通拥堵等方面具有十分重要的作用&#xff0c;自动驾驶系统又是智能车辆的核心。近年来&#xff0c;随着智能车辆的应用场景日益广泛&#xff0c;人工智能算法在自动驾驶系统中广泛应用&#xff0c;自动驾驶系统功能不断增强&#xff0…

ccc-pytorch-RNN(7)

文章目录一、RNN简介二、RNN关键结构三、RNN的训练方式四、时间序列预测五、梯度弥散和梯度爆炸问题一、RNN简介 RNN&#xff08;Recurrent Neural Network&#xff09;中文循环神经网络&#xff0c;用于处理序列数据。它与传统人工神经网络和卷积神经网络的输入和输出相互独立…

Revit导出CAD图纸操作及批量导出

一、Revit如何导出CAD格式图纸 1.打开Revit模型。 2.项目浏览器&#xff0c;图纸(全部)&#xff0c;鼠标右键点击&#xff0c;新建图纸。 3.选择自己需要的图纸大小&#xff0c;点击“确定”&#xff0c;即可创建一张图纸。 4.找到想要导出的图纸标高或者立面&#xff0c;例如&…

idea leetcode插件无法登录

em 2022某天 leetcode-cn.com 改为了 leetcode.cn so , 如果是版本比较老idea leetcode插件, 就无法使用了. 因为用的旧域名 先说解决办法: 2.0 先把旧版本卸载了 2.1 ideaplugin官网找到本地idea版本下可安装的最高版本的leetcode.cn 假设是 leetcode-editor-6.9.zip 2.2 下…

2023年3.8女神节买台灯怎么挑选?台灯用什么样的比较好

最近女神节&#xff0c;祝广大女性朋友们节日快乐啊。娱乐之余&#xff0c;一些实用的东西也是非常适合作为礼物送给女性朋友哦&#xff0c;台灯就是其中一个不错的选择。 台灯作为一种智能家居产品&#xff0c;不仅可见点缀卧室房间装饰&#xff0c;晚上的时候开启小范围照明&…

uniapp+uniCloud实战项目报修小程序开发

前言 本项目基于 uniapp uniCloud 云开发&#xff0c;简单易用&#xff0c;逻辑主要是云数据库的增删查改&#xff0c;页面大部分自写&#xff0c;部分使用uniUI, uView 组件库。大家可用于学习或者二次开发&#xff0c;有什么不懂的地方可联系 wechat&#xff1a;MrYe443。用…

2023-03-09 MySQL源码分析-MySQL中的直方图

摘要: 直方图的在查询优化中的作用主要是为了优化器中的代价模型提供代价中的统计信息计算, 本文对其进行分析 Histogram In MySQL mysql hitograms目录中为mysql所提供的直方图的相关基础设施代码。在mysql 8.0之前其没有使用直方图作为统计信息来为查询优化提供支持。 早期的…

请教大神们,pmp考试和复习有什么攻略诀窍吗?

PMP考试通过率挺高的&#xff0c;很多考生也是朝九晚五甚至天天加班的打工人&#xff0c;还是有很多人通过了的&#xff0c;我也是下班后和周末才有时间学习的&#xff0c;3A通过&#xff0c;但不是什么考试大神&#xff0c;每天抽出3-4个小时跟着培训机构制定的学习计划学习&a…

Linux高并发服务器之Linux多线程开发

Linux高并发服务器之Linux多线程开发一、线程概述二、线程操作相关函数1、创建线程2、线程终止3、线程连接4、线程分离5、线程取消6、线程属性三、线程同步1、多线程卖票案例2、互斥锁解决卖票问题3、读写锁优化卖票问题4、生产者消费者模型5、条件变量解决生产者消费者问题6、…

[ 云计算 | Azure ] Episode 03 | 描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx

正常情况如果你不是会计&#xff0c;或者对钱相关的数字比较敏感的财务&#xff0c;本文的一些东西你不会接触的&#xff0c;但是最为云架构或者云运营&#xff0c;你可能会遇到如何采购亦或者估算的我成本和运营成本等等&#xff0c;所以本文的一些知识点就需要进行一定的了解…

哪款蓝牙耳机音质好?内行推荐四款高音质蓝牙耳机

蓝牙耳机经过近几年的快速发展&#xff0c;在音质上的表现也越来越好。哪款蓝牙耳机音质好&#xff1f;最近看到很多人问。接下来&#xff0c;我来给大家推荐四款高音质蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱蓝牙耳机 参考价&#xff1a;246 发声单元&#xff…