C++ 左值右值引用梳理
C++ 左值右值引用梳理
左值与右值的区别
在参考资料上看到这样一句话
https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c
In C++ an lvalue is something that points to a specific memory location. On the other hand, a rvalue is something that doesn’t point anywhere. In general, rvalues are temporary and short lived, while lvalues live a longer life since they exist as variables. It’s also fun to think of lvalues as containers and rvalues as things contained in the containers. Without a container, they would expire.
总的来说,左值可以获取地址,而右值不能。lvalue指的是可以放在赋值表达式左边的事物——在栈上或堆上分配的命名对象,或者其他对象成员——有明确的内存地址。rvalue指的是可以出现在赋值表达式右侧的对象——例如,文字常量和临时变量。
同样的,在《现代C++语言核心特性解析》中有这句话:
在C++中所谓的左值一般是指一个指向特定内存的具有名称的值(具名对象),它有一个相对稳定的内存地址,并且有一段较长的生命周期。而右值则是不指向稳定内存地址的匿名值(不具名对象),它的生命周期很短,通常是暂时性的。基于这一特征,我们可以用取地址符&来判断左值和右值,能取到内存地址的值为左值,否则为右值。
右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。左值可以在左边也可以在右边,右值只能在右边,举例说明
int x = 666; // ok
int* y = &x; // ok
666 = y; // error!
这里666是一个右值;一个字面常量,没有特定的内存地址。这个数字被分配给x,这是一个变量。一个变量有一个特定的内存位置,所以它是一个左值。C++声明赋值需要左值作为其左操作数。
第二句话,通过取地址运算符&将x的地址取出,&x是一个临时变量,是一个右值。
第三句话,666是一个右值,不能放在左边。
返回左值和右值的函数
对比这两个例子
int setValue()
{return 6;
}// ... somewhere in main() ...setValue() = 3; // error!
第一个例子,setValue()返回一个右值(临时数字6),它不能是赋值的左操作数。
int global = 100;int& setGlobal()
{return global;
}// ... somewhere in main() ...setGlobal() = 400; // OK
第二个例子,setGlobal返回一个引用,不像上面的setValue()。
参考链接:
【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 )
关于引用为什么可以做左值,可以参考:,其实你看底层,就是指针的简化,理解后就可以明白为什么可以做左值。
从外到内理解c++引用,一文清晰解读。
C++引用在本质上是什么,它和指针到底有什么区别?
左值引用和右值引用的区别
左值引用
顾名思义,左值引用就是给左值的引用,给左值取别名。右值引用就是对右值的引用,给右值取别名。而C++11中新增了的右值引用语法特性。
在赋值运算符左侧是左值引用符,右侧必须是左值;在赋值运算符左侧是右值引用符,右侧必须是右值。
看下面的例子:
int y = 10;
int& yref = y;
yref++; // y is now 11
int& yref = 10; // wrong
void fnc(int& x)
{
}int main()
{fnc(10); // Nope!// This works instead:// int x = 10;// fnc(x);
}
但是下面的例子成功:
void fnc(const int& x)
{
}int main()
{fnc(10); // OK!
}
更新到这里,下次再补充。
右值引用
完美转发
相关文章:
C++ 左值右值引用梳理
C 左值右值引用梳理 左值与右值的区别 在参考资料上看到这样一句话 https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c In C an lvalue is something that points to a specific memory location. On the other hand, a rvalue is somethi…...
向量化技术在机器学习领域的深度实践与探索
向量化技术的魅力初现 在机器学习的广袤天地中,数据是驱动模型学习与进化的核心燃料。然而,面对海量、高维的数据,如何高效地进行处理与利用,成为了研究者们必须面对的问题。向量化技术应运而生,通过将文本、图像、音…...
RuoYi若依框架学习:多环境配置
在开发过程中,项目往往需要在不同的环境(如开发、测试和生产)中运行。RuoYi框架支持通过配置文件轻松实现多环境管理。以下是如何配置和使用多环境的技术分析。 1. 环境配置文件 RuoYi框架使用application-{profile}.yml文件来管理不同环境…...
Linux-RedHat7.4-服务器搭建FTP
Linux FTP 1、安装vsftpd和lftp: yum -y install vsftpd lftp ftp 2、创建用户: vsftpd提供了三种认证方式:本地用户、虚拟用户、匿名用户,本文介绍本地用户的认证方式。 注:本文创建的本地用户为只能访问ftp&…...

遍历递归数结构,修改里的disabled值
返回参数中新增字段 disabled,后端给的值为1和2, disabled1时,代表该节点需要置灰,不可选中 现在需要将disabled的值,改为布尔类型; 后端给的数结构是对象类型,tree接收数组类型; 先将对象类型的数据,遍历递归,修改里面的disabled值,最后再加[ ],改为…...

怎么通过AI大模型开发一个网站?
目录 一、提示词与AI输出 二、网站效果 以前不会代码开发,写网站是不可能的事情,现在有了AI,一切都有了可能。以下是我通过通义千问大模型开发的简单网站。 一、提示词与AI输出 提示词1 你是python程序员,我有一个大的需求&am…...
【Kubernetes】常见面试题汇总(四十)
目录 93. Kubelet 与 kubeproxy 作用。Kubeproxy 的三种代理模式和各自的原理以及它们的区别。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-113 属…...
数据仓库-数据命名标准规范
一:主题域 1.1 业务主题域1.2 分析主题域1.3 数据域二: 词根 2.2 业务词根三:对象数据规范 3.1 表规范 3.1.1 数据装载周期3.1.2 数据装载方式3.1.3 表命名规范3.2.1 分区字段3.2.2 其他通用字段3.3 指标规范 3.3.1 时间修饰词3.3.2 常用度量3.3.2 指标命名3.4 ETL命名规范...

OCR识别系统 YOLOv8 +Paddle 方案落地
YOLOv8 PaddleOCR 技术方案落地 Yolov8相关文档Step 1 证件模型的训练Step 2 Yolov8进行图片推理Step 3 PaddleOCR进行识别Step 4 整合Yolov8 PaddleOCR 进行OCR Yolov8相关文档 《yolov8 官方网站》 《Yolov8 保姆级别安装》 Ultralytics YOLOv8 是一款尖端的、最先进的 (S…...

828华为云征文|部署去中心化网络的 AI 照片管理应用 PhotoPrism
828华为云征文|部署去中心化网络的 AI 照片管理应用 PhotoPrism 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 PhotoPrism3.1 PhotoPrism 介绍3.2 PhotoPrism…...

【PAM】Linux登录认证限制
PAM(Pluggable Authentication Modules,可插拔认证模块)是一种灵活的认证框架,用于在 Linux 和其他类 Unix 系统上管理用户的身份验证。PAM 允许系统管理员通过配置不同的认证模块来定制应用程序和服务的认证方式,而不…...
Go语言Mutex的优化与TryLock机制解析
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 Go语言中的Mutex优化与goroutine调度机制 Go语言的开发团队于2011年6月30日对Mutex进行了重大调整,这次调整主要目的是优化并发场景下的锁竞争,尤其是在多goroutine争抢同一把锁时的处理。这次优化不仅改进了锁…...

基于TSN的实时通信网络延迟评估技术
论文标题:A TSN-based Technique for Real-Time Latency Evaluation in Communication Networks 作者信息: Alberto Morato, Claudio Zunino, Manuel Cheminod, Stefano Vitturi,来自意大利国家研究委员会,CNR-IEIIT。电子邮件:…...

初识ZYNQ——FPGA学习笔记15
一、ZYNQ简介 ZYNQ:Zynq-7000 All Programmable SoC(APSoC),赛灵思公司(AMD Xilinx)推出的新一代全可编程片上系统 PS:Processing System,处理系统 PL:Program Logic&…...
理论-链表的头结点
所为头结点,是为了使空链表和非空链表的处理统一而在链表的头部增加的一个节点,这样无论链表是否为空,头指针都指向头结点,头结点中不存数据而只是存放指向第一个节点的指针。没有头结点的链表,头指针就指向第一个节点…...
oracle 分表代码示例
在Oracle数据库中,分表通常指的是将一个大表分解成多个较小的表,以提高管理和查询效率。这通常是通过分区(Partitioning)来实现的,而不是传统意义上的将表拆分成多个独立的表。不过,如果你确实需要将一个大…...
【MySQL】regexp_replace在MySQL以及regexp extract all在MySQL的用法
一、regexp_replace在MySQL的用法 在MySQL中,REGEXP_REPLACE() 函数用于在字符串中搜索正则表达式模式,并用指定的字符串替换该模式的每个匹配项。以下是其基本用法: 语法 REGEXP_REPLACE(expression, pattern, replace_string[, pos[, oc…...
详解 FFmpeg 中的 -map 选项
FFmpeg 是一个强大的多媒体处理工具,可以处理各种音视频转换、编辑任务。-map 选项是 FFmpeg 中非常重要且灵活的一个功能,它允许用户精确控制输入流如何映射到输出文件中。使用 -map,可以指定视频、音频或字幕等特定流进行处理,这…...

学习threejs,绘制二维线
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言二、🍀绘制二维线1. ☘️…...

跑lvs出现soft connect怎么处理?
首先,我们先了解一下什么是soft connect。简而言之,就是工具会将所有连接在psub上的信号认作soft connect(也就是short)。如图1所示,VSS和AVSS都接到了p上,它们通过psub便有了soft connect。 如果有soft co…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...