左值和右值的简单理解

news/2025/3/28 13:48:00/文章来源:https://www.cnblogs.com/barry-first/p/18790537

左值(lvalue)和右值(rvalue)是C++中表达式的基本分类,理解它们对资源管理、移动语义和代码优化至关重要。以下是它们的核心概念及区别:


左值(lvalue)

  1. 定义

    左值表示有明确内存地址、具名的对象,可以出现在赋值运算符(=)的左侧,生命周期通常持续到作用域结束。

  2. 特点

    • 可以被取地址(如 &x)。

    • 可以重复使用和修改。

    • 通常是变量、函数返回的引用、字符串字面量等。

    示例

    
    int a = 10;        // a 是左值int& func();       // func() 返回左值引用,是左值const char* s = "hello"; // "hello" 是左值(字符串字面量)

右值(rvalue)

  1. 定义

    右值表示临时对象或字面量,通常没有持久的内存地址,只能出现在赋值运算符的右侧。

  2. 特点

    • 不能被取地址(如 &5 非法)。

    • 通常是表达式计算的中间结果、字面量、函数返回的非引用类型等。

    • C++11 后分为 纯右值(prvalue)将亡值(xvalue)

    示例

    
    int b = 5;              // 5 是右值(字面量)int c = a + b;          // a + b 的结果是右值std::string s = "tmp";  // "tmp" 是右值(临时构造的字符串)

C++11 后的扩展

  1. 将亡值(xvalue)

    • 通过 std::move 转换的左值,表示资源可被“窃取”的右值。

    • 示例:int&& d = std::move(a);a 变为 xvalue)。

  2. 右值引用(&&

    • 用于绑定右值,支持移动语义(避免深拷贝)。
    
    void func(int&& val);  // 接受右值参数func(10);              // 合法,10 是右值

关键区别

| 特性 | 左值 | 右值 |

|---------------------|-----------------------|-----------------------|

| 内存地址 | 有(可取地址) | 无(临时存在) |

| 赋值操作符左侧 | ✔️ 允许 | ❌ 禁止 |

| 生命周期 | 持续到作用域结束 | 通常为临时对象 |

| 示例 | 变量、具名对象 | 字面量、临时结果 |


应用场景

  1. 函数重载

    
    void process(int& x);   // 处理左值void process(int&& x);  // 处理右值
  2. 移动语义

    通过 std::move 将左值转为右值,优化资源转移(如 std::vector 的移动构造)。

  3. 完美转发

    结合 std::forward 保留参数的值类别(左值/右值)。


总结

  • 左值:具名、持久、可修改的对象。

  • 右值:临时、短暂、不可取地址的值。

  • C++11 的右值引用:允许高效资源管理,是现代C++高效编程的核心机制之一。

理解左值与右值有助于编写更高效、更安全的代码,尤其是在涉及移动语义和资源管理时。

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

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

相关文章

推荐8款 .NET 开源、免费、实用的 Windows 效率软件

前言 今天大姚给大家推荐8款基于 .NET 开源、免费、实用的 Windows 效率软件,开发工作提升利器,希望可以帮助到有需要的小伙伴。 DevToys DevToys是一个专门为开发者设计的Windows工具箱,完全支持离线运行,无需使用许多不真实的网站来处理你的数据,常用功能有:格式化(支…

解密prompt系列51. R1实验的一些细节讨论

DeepSeek R1出来后业界都在争相复现R1的效果,这一章我们介绍两个复现项目SimpleRL和LogicRL,还有研究模型推理能力的Cognitive Behaviour,项目在复现R1的同时还针对R1训练策略中的几个关键点进行了讨论和消融实验,包括DeepSeek R1出来后业界都在争相复现R1的效果,这一章我…

读DAMA数据管理知识体系指南30文件和内容治理

读DAMA数据管理知识体系指南30文件和内容治理1. 方法 1.1. 诉讼应诉手册1.1.1. 电子取证工作一般在发生诉讼的时候进行1.1.2. 指引应明确电子取证的目标环境,并评估当前环境和目标环境之间是否存在差距1.1.3. 应记载电子取证活动生命周期的业务流程,明确电子取证团队的角色和…

为什么springboot的jar可以直接启动

一、讲述 1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。 2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的 类。 3.java -jar会去找jar中的manifest文件,在那里面找…

折腾笔记[17]-使用rust创建linux系统服务

使用rust内嵌配置文件, 创建新用户并创建linux的service服务;实现后台服务循环打印时间到`/tmp/log_file_service`. Use Rust to embed configuration files, create new users, and create service services for Systemd; Implement a backend service loop to print time to …

[PNPM] 其他包管理器

Yarn Yarn 这个包管理器是在 2016 的时候由 Facebook、Google、Exponent 以及 Tilde 团队共同开发推出的。当时 Yarn 的出现主要是为了解决 npm 在速度、安全性以及一致性方面的一些问题:安装速度确定性:项目A ---> 直接依赖: libraryX(1.0)-----> 间接依赖:librar…

Kioptrix Level_1

Kioptrix Level 1.1 靶场配置 导入靶场时先将vmx后缀文件中的带有ethernet0的配置行全部删除,再导入靶场,添加一个网络适配器即可 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168…

20244209韩仕炜《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名:韩仕炜 实验教师:王志强 学号:20244209 实验日期:2025年3月24日 必修/选修:专选课 1. 实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编写一…

E1. Canteen (Easy Version)E2 Canteen (Hard Version) 对于旋转操作的深入理解

E1. Canteen (Easy Version) 题解:二分查找 + 模拟 本文大量学习了jiangly的代码对其进行详细的解析并作图对其进行解释 题目链接 深入解析:前缀和最小值旋转的直观意义一、前缀和曲线的数学本质 我们定义前缀和数组为: pre[i+1] = pre[i] + a[i] - b[i]这一公式的物理意义是…

20244209 2024-2025-2 《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名:韩仕炜 实验教师:王志强 学号:20244209 实验日期:2025年3月24日 必修/选修:专选课 1. 实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编写一…

ASP.NET Core WebApi+React UI开发入门详解

在前段时间,有粉丝反馈能否写一篇基于ASP.NET Core Web Api+React UI进行Web开发的文章,经过查阅相关资料,发现Visual Studio 2022已经集成相关模板,可以在Visual Studio中直接创建项目项目,今天以一个小例子,简述ASP.NET Core Web Api+React UI开发系统的基本步骤,仅供…