当前位置: 首页 > news >正文

C++笔记 将亡值 左右值(基础)

在 C++ 基础进阶中,左值(lvalue)右值(rvalue)将亡值(xvalue)是理解变量存储、内存管理、移动语义的核心概念。很多新手会被这几个概念绕晕,其实它们的区分逻辑非常清晰,本文用最通俗的方式讲透三者的定义、区别和用法。

一、先搞懂:左值 和 右值

C++ 中,所有的表达式都有值类别,最基础的分类就是左值右值

1. 左值(lvalue)

定义:可以放在赋值号=左边有名字、有内存地址、可以被修改的值。简单记忆:能取地址、有名字的就是左值

左值核心特征
  1. 持久存在:在内存中有固定存储,不会用完就销毁
  2. 可寻址:能用&取到内存地址
  3. 有名字:变量名、对象名都是左值
  4. 可修改:非 const 左值可以被赋值
左值示例
int a = 10; // a是左值,有名字,能&a取地址 a = 20; // 左值可以放在=左边赋值 int& ref = a; // 左值可以初始化左值引用 const int b = 30; // b是const左值,有地址,不可修改

2. 纯右值(prvalue)

定义:只能放在赋值号=右边没有名字、没有固定内存地址、用完即销毁的值。简单记忆:临时字面量、临时计算结果,都是纯右值

纯右值核心特征
  1. 临时存在:执行完当前语句就销毁,不持久存储
  2. 不可寻址:不能用&取地址
  3. 无名字:只是一个临时值,没有变量名
  4. 不能放在=左边赋值
纯右值示例
int a = 10; // 10、20、30 都是纯右值 a = 20; int b = a + 30; // a+30的计算结果是纯右值 // 错误示例:纯右值不能放在=左边 // 10 = a; 编译报错 // &(a+30); 编译报错,不能取地址

二、进阶概念:将亡值(xvalue)

这是 C++11 引入的新概念,全称eXpiring Value(即将消亡的值)

1. 将亡值是什么?

定义本质是临时值,但可以被 “移动”,是左值和纯右值的中间态。简单记忆:马上要被销毁,但还能被利用的临时值

2. 将亡值的来源

将亡值只有两种场景:

  1. 使用std::move转换后的左值
  2. 返回右值引用的函数调用结果

3. 将亡值核心特征

  1. 即将销毁:生命周期马上结束,原本会被释放资源
  2. 可被移动:可以把它的内存、资源 “偷” 过来,避免拷贝
  3. 不可取地址:和纯右值一样,没有固定持久地址

将亡值示例

#include <utility> // std::move 头文件 int a = 100; // std::move(a) 把左值a转换成将亡值 int&& rref = std::move(a);

这里std::move(a)就是将亡值:它原本是左值a,标记为 “即将消亡”,后续可以直接移动a的资源,而不是拷贝。

三、三者核心区别(一张表看懂)

表格

类别有无名字能否取地址生命周期核心用途
左值(lvalue)持久变量、对象、赋值左边
纯右值(prvalue)不能临时字面量、临时计算结果
将亡值(xvalue)不能即将销毁移动语义、资源转移

一句话总结区分规则

  1. 有名字、能取地址 → 左值
  2. 临时字面量 / 计算结果 → 纯右值
  3. std::move/ 右值引用返回 → 将亡值

四、关键应用:为什么要学将亡值?

C++11 之前只有左右值,会造成大量不必要的内存拷贝,而将亡值是移动语义的基础,能大幅提升程序性能。

举个例子:

// 拷贝数据(慢):把临时字符串复制一份 string s1 = "hello" + " world"; // 移动数据(快):直接偷走临时字符串的资源,不拷贝 string s2 = std::move(s1);

"hello" + " world"纯右值std::move(s1)将亡值,编译器会自动调用移动构造 / 移动赋值,避免拷贝开销。

五、易混点总结(避坑指南)

  1. const 左值:有名字、能取地址,属于左值,只是不能修改
  2. 右值引用(&&):只能绑定纯右值 / 将亡值,不能绑定左值
  3. 将亡值不是左值也不是纯右值,是独立类别
  4. 所有临时对象都是纯右值 / 将亡值,生命周期只在当前语句

总结

  1. 左值:有名字、能取地址、持久存在,是程序中最常用的变量
  2. 纯右值:临时值、无名字、用完即毁,比如数字、计算结果
  3. 将亡值:C++11 新增,即将消亡但可被移动的值,是移动语义的核心
  4. 核心判断:能取地址 = 左值,临时值 = 右值,move 标记 = 将亡值
http://www.jsqmd.com/news/550118/

相关文章:

  • 探寻上海帝爵汽车服务,上海报废车回收费用多少钱? - 工业设备
  • 用Python爬B站弹幕做情感分析:从数据抓取到SnowNLP实战,附完整代码
  • 08_gstack企业级:安全加固、监控治理与团队协作
  • Cursor Pro功能解锁技术解析与实践指南
  • 欧姆龙3G3MX2变频器Ethercat选件配置避坑指南(含紧急故障复位技巧)
  • 数字游民工具链:OpenClaw+Qwen3.5-9B管理远程工作
  • 破除工业编程壁垒:OpenPLC Editor可视化开发全攻略
  • AI大模型浪潮来袭!小白程序员必备指南,收藏学习不迷路!
  • Nucleus Co-Op:突破单机游戏限制的多人分屏革新工具
  • 2026年螺旋输送机械厂家推荐:广东甲宝输送机械,多型号螺旋上料机/输送机一站式供应 - 品牌推荐官
  • 保姆级拆解:从一块硅片到你的手机芯片,CMOS制造到底经历了什么?
  • 告别复杂提示词:Asian Beauty Z-Image Turbo默认设置秒出东方人像
  • 三大AI-IDE实战:如何用OneCode注解快速生成电商后台管理系统(附避坑指南)
  • 3个维度深度解析asusctl:为什么说这是Linux硬件控制领域的架构典范?
  • 告别前端直传:手把手教你用Java CompletableFuture优化MinIO大文件上传性能
  • OpenClaw+GLM-4.7-Flash智能家居:自然语言控制家庭自动化
  • AI绘画管家:OpenClaw+Qwen3.5-9B批量整理Stable Diffusion产出
  • 飞书文档转Markdown终极解决方案:99%格式还原率解放你的文档处理效率
  • 别只盯着加密:拆解GPC SCP03里MAC和R-MAC的‘双保险’设计到底防了啥
  • 避坑指南:STM32CubeMX生成Keil工程时容易忽略的5个细节
  • 别再死记硬背ASK、PSK、QAM了!用Wi-Fi和蓝牙的日常例子,5分钟搞懂线性与非线性调制
  • Mirage Flow互联网信息整合应用:智能爬虫与内容摘要生成系统
  • 避坑指南:三维Pair-Copula (C-Vine/D-Vine) 建模时,90%新手会踩的这两个积分计算坑
  • Wireshark实战:从抓包到解析,深入理解TCP三次握手与四次挥手
  • STL到STEP转换终极指南:从3D打印到工程设计的无缝桥梁
  • 告别手点!用SAM-Veteran这个MLLM智能体,让AI像老手一样自动分割图片
  • 手把手教你用像素语言·维度裂变器:从入门到精通
  • 2026年工业/临时/户外/大型/移动/定制仓储篷房厂家推荐:常州春秋会展篷房全系解决方案 - 品牌推荐官
  • Atlas OS中Xbox应用0x89235107错误的完整解决方案
  • Mermaid声明式图表引擎技术架构评估报告