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

【C++】014、左值与右值的区别

一、左值&右值

左值:

  • 左值是有内存地址的持久对象,可以取他的地址值

右值:

  • 右值是临时的,即将销毁的对象,不能取他的地址,但可以窃取他的资源。右值的存储位置通常在栈或者寄存器内。

右值引用(T&&)

  • 右值引用是为了把右值这种临时资源拿来继续使用

二、左值与右值的鉴别方法

  • 在C++中,能对表达式使用取地址运算符&的就是左值,不能取地址的就是右值

int a = 10; // a 是左值(&a 合法) int* p = &a; // ✅ OK // int* p2 = &10; // ❌ 编译错误!不能对字面量取地址,所以 10 是右值

三、对比

对比维度

左值

右值

别名

有身份的

无身份的(临时)

取地址操作(&)

可以

不可以

生命周期

长(有自己的作用域)

短(面临销毁)

例子

变量(a),++i,*ptr

字面量10,i++,MyClass()

能否放在=左边

通常可以

不可以(除非使用move)

右值引用(T&&)

不可以(除非使用move)

可以

四、移动赋值操作:std::move

1、窃取资源

  • std::move 本质上只是一个强制类型转换(static_cast),不移动任何东西,只是将左值变成右值。

  • 真正的移动发生在移动构造函数和移动赋值运算赋里,编译器看到右值,从而窃取资源而非深拷贝

  • 代码

#include <iostream> #include <vector> #include <utility> // for std::move class BigData { private: std::vector<int> data; // 假设很大,10000个元素 public: // 1. 构造函数(建立资源) explicit BigData(size_t size) : data(size, 1) { std::cout << "Constructed (allocated memory)\n"; } // 2. 拷贝构造函数(深拷贝,开销大) BigData(const BigData& other) : data(other.data) { std::cout << "Copied (expensive deep copy)!\n"; } // 3. 移动构造函数(轻量级指针交换,C++11核心!) BigData(BigData&& other) noexcept : data(std::move(other.data)) { // 精髓:直接窃取 other 的内部指针,other.data 变为空 std::cout << "Moved (cheap pointer swap)!\n"; } }; BigData createBigData() { BigData temp(10000); // 创建临时对象(左值) return temp; // 返回时触发移动语义(C++17强制拷贝省略前,优先选移动) } int main() { BigData obj1(10000); // 构造 BigData obj2 = obj1; // 拷贝(深复制,慢) -> 输出 "Copied!" BigData obj3 = std::move(obj1); // 移动(偷数据,快) -> 输出 "Moved!" // 注意:此时 obj1 处于“有效但未指定”的状态(通常是空),不要再使用 obj1! }

2、右值引用(T&&)专门用来捕获右值,从而在不拷贝的情况下转移资源

  • 右值引用智能绑定右值,如果想把左值当右值用,必须通过move显示转换

int a = 5; int& lr = a; // OK // int& lr2 = 10; // ❌ 错误 const int& clr = 10; // ✅ OK(临时对象生命周期被延长到引用生命周期) int&& rr = 10; // ✅ OK // int&& rr2 = a; // ❌ 错误(不能直接绑左值) int&& rr3 = std::move(a); // ✅ OK(强制转换,此时a的资源可以被偷)

3、总结:

  • 左值是有户口本的居民; 右值是有暂住证的旅客; move是让居民办理临时注销,把资源合法转移给新用户。

http://www.jsqmd.com/news/1144950/

相关文章:

  • 暑期成长转型实操指南:凤凰少年 AI 分层特训能力进阶手册
  • BUUCTF 简单注册器
  • [特殊字符] 从零到一玩转CODEX智能体开发:一套课搞定AI自动化视频/办公/数字人/小程序
  • 新高考高中语文必背古诗文72篇PDF电子版(含默写练习题)
  • 【UE源码精读-ActionRPG】伤害管线:从捕获到扣血
  • ZYNQ XCZU27DR FreeRTOS TTC 定时器中断学习笔记
  • 算法之旅-Hot100—移动零
  • UE4SS终极指南:5分钟掌握虚幻引擎游戏脚本注入与修改
  • 【C++】015、函数参数:值传递,指针传递,引用传递的区别
  • 方差(实例实操、与标准差的区别)
  • Windows 11 云重建功能实测:无需U盘也能从云端恢复系统
  • 梅开二度,这次拿下系统分析师
  • 调试问题总结
  • 电玩城测评 3 种拳击机器人:海岸城实测,为什么有的只热闹一阵,有的能拉起 PK 复玩
  • SystemC:内核回调函数
  • 会计岗位智能报税和对账用哪款Agent?主流企业级智能体选型与技术解析
  • 研究生招生国家分数线 API 接口
  • 我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
  • 倒置荧光显微镜LF200-类器官与器官芯片:生命科学的前沿窗口
  • 长沙阳台推拉门怎么选?不卡顿、不漏水、隔音好,照着选就对了
  • S32K14X CAN
  • 我给 AI 提了个小需求,它帮我“重构“了整个系统——AI 编程范围失控怎么办?
  • 深度解密大模型 Agent 的终极银弹:Browser(浏览器沙箱)操作全指引与检索降级闭环
  • 自动调整学习率
  • LangGraph 工作流:普通开发者先补哪三块
  • 直线电机在3D打印中的精密运动控制应用与优化实践
  • AI知识库技术:构建个人B站视频检索系统的实践指南
  • Napping: 1.0.1靶场攻略
  • 系统日志智能分析和数据库自动备份怎么做?从工程实践到企业级智能自动化选型建议
  • Oracle 11g RAC 多路径配置总搞不定?iSCSI + Multipath + ASM 磁盘组,14节视频带你完整通关