2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻
目录
- 前言
- 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;
相关文章:
2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻
目录前言C左值和右值二、右值引用二、右值引用前言 对于C的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接在这,话不多说讲解一…...
Vue3这样子写页面更快更高效
在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1,2 个页面的时候大多数开发者可能会直接将之前的页面代码再拷贝多…...
锐捷AP设置限速(胖模式)
基于整个AP限速命令 Ruijie(config)#wlan-qos ap-based { per-user-limit | total-user-limit } { down-streams | up-streams } average-data-rate average-data-rate burst-data-rate burst-data-rate per-user-limit 对AP上的每个用户进行限速 …...
聚势合力,电巢与SDIA协会“战略合作签约仪式”圆满落成
前言: 2023年03月02日下午,电巢科技与深圳市平板显示行业协会齐聚深圳南山电巢XR演播厅,共同举办了隆重的战略合作签约仪式。 双方就数字化建设、品牌赋能、人才培养、技术创新等企业服务深入合作上达成一致,合力为产业赋能&…...
Linux安装后基础配置--网络--ssh--基本软件
安装教程比较多就不写了。 网络配置 设置虚拟网络 修改网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33将ONBOOT由no改为yes: 修改为静态网络 /etc/sysconfig/network-scripts/ifcfg-eth33 BOOTPROTOstatic IPADDR192.168.1.129 GATEWAY192.168…...
剑指 Offer 66. 构建乘积数组
剑指 Offer 66. 构建乘积数组 难度:middle\color{orange}{middle}middle 题目描述 给定一个数组 A[0,1,…,n−1]A[0,1,…,n-1]A[0,1,…,n−1],请构建一个数组 B[0,1,…,n−1]B[0,1,…,n-1]B[0,1,…,n−1],其中 B[i]B[i]B[i] 的值是数组 AAA…...
1.1 误差的来源
不难发现,考察用计算机解决科学计算问题时所经历的几个环节(如图1-1所示),其中每一步都可能产生误差,首先,数学模型是通过对实际问题进行抽象与简化得到的,它与实际问题之间有误差.数学模型与实…...
python进程间通信
进程间通信表示进程之间的数据交换。 为了开发并行应用程序,需要在进程间交换数据。 下图显示了多个子过程之间同步的各种通信机制 - 各种通信机制 队列 队列可以用于多进程程序。 多处理模块的Queue类与Queue.Queue类相似。 因此,可以使用相同的API…...
麒麟Linux操作系统磁盘策略永久调整为deadline
1.前言在安装数据库,比如达梦数据库时,为获取磁盘最佳性能,一般要将数据磁盘设置为deadline。2. 修改磁盘调度算法2.1临时修改假设磁盘为sda,echo deadline > /sys/block/sda/queue/scheduler2.2通用机永久修改grubby --update-kernelALL …...
yum安装Docker(CentOS7.9)
目录 一、安装环境 编写yum源(根据系统版本) 二、安装docker-ce 默认安装docker-ce是最新版本 ps:安装不成功则需要安装container-selinux,下载网络yum源,再安装docker-ce即可 #查看dcoker-ce所产生的文件路径 三、启动docker 四、配置镜像加速器…...
c++错误 free(): double free detected
记一次bug调试。。。。 我定义了一个类,测试的时候,调用它的方法出现了free(): double free detected ,但是调用其他方法是正常的。这个错误,字面意思就是检测到了双重释放。是指对于同一块内存,释放了两次。 我的类…...
12升400V 升压DC-DC高压脱毛仪解决方案SC3671
ipl(intense pulsed light,强脉冲光)脱毛,也叫光子脱毛,是市场上的一种新型脱毛技术和美容方法,其利用强脉冲光特殊的波长和光热效应实现破坏毛囊并达到永久脱毛的效果,具有速度快,效果好,安全性…...
h264格式分析
h264格式分析一.简介二.h264编码原理1.帧间压缩2.帧内压缩三.编码结构1.IDR帧2.解码顺序四.NALU1.nalu头信息2.annexb模式一.简介 h264是一种视频编码标准,又叫Advanced Video Codec,即AVC 二.h264编码原理 1.帧间压缩 通过I、B、P帧实现帧间压缩 I…...
【数据分析师求职面试指南】实战技能部分
文章目录必备技能数据人员如何创造价值完整的指标体系构建数据监控集报表设计设计一份优质的数据分析报告基于互联网大数据的应用A B 测试用户画像完整的数据挖掘项目流程1. 分析问题,明确目标2.模型可行性分析3.选取模型4.选择变量5.特征工程6.建立模型&效果…...
树与二叉树(二叉树的表示,性质,遍历,还原)
基本术语:A(或B)是I的祖先,I是A(或B)的子孙;D是I的双亲,I是D的孩子;节点的孩子个数称为节点的度;树中节点的最大度数称为树的度;度大于0的节点称为…...
mysql 源码学习理解记录--lock_rec_move
记录源码学习笔记,如有错误,还请帮忙指正。 Lock_rec_move 函数使用场景之用于update Update 匹配条件时会用lock_rec_lock先加锁。然后再进行ha_update_row 操作。 在修改时,当修改的字段前后长度不一致时,会导致不能原地修改…...
markdown(.md)常用语法
markdown(.md)常用语法markdown常用语法常用目录标题分割线格式空格换行无序列表有序列表列表嵌套文字引用行内代码代码块字体转义斜体加粗删除线下划线功能链接todo listtypora插入图片并保存在本地包含了一些常用的MD语法和操作,语法不是很…...
千言数据集赛题介绍
赛题题目 通用信息抽取任务评测 将多种不同的信息抽取任务用统一的通用框架进行描述,着重考察相关技术方面在面对新的、未知的信息抽取任务与范式时的适应和迁移能力。 赛题介绍 信息抽取旨在将非结构化文本中的信息进行结构化,是自然语言处理的基础…...
信息技术最全总结(备考教资)
信息技术 备考教资信息技术知识点总结,欢迎收藏!需要xmind和备考书籍的可以评论区留言。 第一部分-学科专业知识 第一章-信息技术基础知识 信息与信息技术概述 信息概述 信息的定义 信息本身不是实体信息是通过文字、数字、图像、图形、声音、视频等方…...
opencv识别车道线(霍夫线变换)
目录1、前言2、霍夫线变换2.1、霍夫线变换是什么?2.2、在opencv中的基本用法2.2.1、HoughLinesP函数定义2.2.2、用法3、识别车道3.1、优化3.1.1、降噪3.1.2、过滤方向3.1.3、截选区域3.1.4、测试其它图片图片1图片2图片31、前言 最近学习opencv学到了霍夫线变换&am…...
自动驾驶强化学习实战指南:HighwayEnv深度配置与优化技巧
自动驾驶强化学习实战指南:HighwayEnv深度配置与优化技巧 【免费下载链接】HighwayEnv A minimalist environment for decision-making in autonomous driving 项目地址: https://gitcode.com/gh_mirrors/hi/HighwayEnv HighwayEnv是一个专为自动驾驶决策任…...
如何评估你的 Agent 是否真的在思考
重新审视智能:如何用科学、工程与可量化标准评估你的 Agent 是否真的在思考 警告:全文约 12.7 万字,由 8 个核心章节组成,单节最低字数超过 1.1 万字。建议分段阅读,配合工具与项目实践,可获得最佳学习效果。 0. 章节导航与阅读建议 为了帮助不同背景的读者(从 AI 产品…...
Cursor Pro破解工具:5步实现永久免费使用的终极指南
Cursor Pro破解工具:5步实现永久免费使用的终极指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial…...
桌面3D扫描技术解析:从结构光原理到实战避坑指南
1. 从工业殿堂到桌面工坊:3D扫描的平民化浪潮 几年前,如果你跟人提起3D扫描,脑海里浮现的画面多半是电影特效工作室里,演员身上贴满标记点,被一圈昂贵的专业相机环绕;或者是汽车制造车间里,巨大…...
win11的自带媒体播放器-可以设置它的播放速度。在右小角的三个点里面。。。
win11的自带媒体播放器-可以设置它的播放速度。在右小角的三个点里面。。。...
百度文心一言开发者如何快速接入多模型服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 百度文心一言开发者如何快速接入多模型服务 如果你正在使用百度文心一言的API进行开发,可能会遇到希望尝试其他模型能力…...
告别CNN!用PyG Temporal和GC-LSTM搞定动态社交网络的好友推荐(附完整代码)
动态社交网络好友推荐的工程实践:基于GC-LSTM与PyG Temporal的完整解决方案 社交网络的动态特性为传统推荐系统带来了巨大挑战。当用户关系每分每秒都在变化时,静态的协同过滤或内容推荐方法往往显得力不从心。本文将分享如何利用PyG Temporal库和GC-LST…...
AMD Carrizo架构解析:SoC集成与HSA异构计算如何重塑移动处理器
1. 从“胶水粘合”到“原生融合”:Carrizo与Carrizo-L的架构革命2014年底,当AMD在新加坡的“计算的未来”活动上拿出Carrizo和Carrizo-L这两颗芯片时,现场的反应可能比预想的要平静一些。毕竟,对于习惯了每年“挤牙膏”式升级的行…...
半导体行业如何应对政策不确定性:从游说策略到企业决策
1. 从一篇旧报道看半导体行业的“华盛顿困局”最近整理资料时,翻到一篇2012年EE Times的旧文,标题是《硅谷国度:选举后的政治僵局或将持续——SIA CEO如是说》。文章不长,但里面半导体行业协会(SIA)时任CEO…...
把旧笔记本变成第二台电脑的“上网卡”:Win10/11网络共享实战指南
旧笔记本秒变网络共享中心:Windows ICS高阶配置指南 你是否遇到过这样的场景:书房里的台式机没有无线网卡,而客厅的旧笔记本却闲置着?其实只需一根网线,就能让这台"退役"设备重新上岗,成为全屋网…...
