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

C++怎么学?零基础也可以,一份完整学习路线图助你搞定! 提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。 阅读详情

一、左值&右值

左值:

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

右值:

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

右值引用(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是让居民办理临时注销,把资源合法转移给新用户。

告别Quartus II的漫长等待:用VSCode+iverilog+GTKWave搭建你的轻量级Verilog仿真环境(2024保姆级教程) 本文详细介绍了如何利用VSCode、iverilog和GTKWave构建高效的Verilog/SystemVerilog开发环境,替代传统的Quartus II和ModelSim工具。通过2024年最新的保姆级教程,帮助开发者实现秒级启动、低资源消耗的轻量级仿真环境,显著提升数字电路设计的开发效率和调试体验。 阅读详情

相关推荐

宝塔面板+pbootCMS建站全流程:从服务器选购到上线优化(附常见问题排查)

本文提供了一份详尽的宝塔面板与pbootCMS建站实战指南。内容涵盖从云服务器选购、宝塔面板部署与安全加固,到pbootCMS安装、权限配置、数据库连接等核心步骤。同时深入讲解了PHP环境优化、Nginx伪静态设置、缓存开启等性能与SEO优化技巧,并附有常见问题排查与后期维护建议,帮助用户高效、稳健地完成专业网站构建。

e4f5g6h的博客 660

c++左值和右值的区别

在c++ 中左值和右值是表达式的两种类别, 他们的主要区别在于和。

chunchun2021的博客 580

World Action Model:经典论文

郑困时,图prorpt为机量人压务时,退过驱制解弱词表(constrsinsd decoding), 强附模型只从.256个者动作token中保H, B象总注活地。始VLA之一,RT-2使用了大量的五联网VQ据与少里的机械网的AcSonDat行CoFine-Tunng, 独组sl, 共i744个episode,Mous使用三个专累模,分是vidogonmedel,actonesget,understandng。包的核定之的的观到沟血黄动作,预之后现(vorlemodel),tseing,2。

u013250861的博客 406

C++中 左值 与 右值 的区别

C++中左值与右值的区别

Balaam' s blogs 3571

Explorer.exe系统错误,电脑重启后刚开始一段时间正常,过一会桌面任务栏就卡死,可以打开任务管理器

联想E14Win10专业版。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 8050

8、水力压裂引起的地质材料力学性质变化的可视化研究

本研究探讨了水力压裂引起的地质材料力学性质变化的可视化方法。利用超声剪切波形数据,通过短时傅里叶变换(STFT)和主成分分析(PCA)进行特征提取和降维,并应用K-means聚类、凝聚聚类和DBSCAN等无监督学习方法对地质力学变化进行非侵入式可视化分析。研究比较了不同特征工程、聚类方法和降维策略对可视化效果的影响,并结合位移不连续性理论为聚类结果分配地质力学变化指数,以提高结果的物理解释性。最终,该方法成功实现了对水力压裂引起的岩石力学性质变化的高效、可靠可视化。

emacs5lisp的博客 109

c++的左值、右值辨析

1、左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体; 右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。 一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。 2、引用 引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量...

jinjin-blog 915

Allegro如何把分离的线段变成封闭连续的图形

Allegeo支持把分离的线段变成封闭连续的图形,以下图为例,线段是分离的。Allegro如何把分离的线段变成封闭连续的图形。Find选择other segs 和Lines。Find选择other segs 和Lines。选择shape-compose shape。分离线段已经是连续封闭的shape形式了。框选图形,删除剩下的无用的分离线段。Find选择shapes。鼠标右击选择done。选择delete命令。鼠标右击选择done。

weixin_54787054的博客 6240

C++左值和右值的区别

左值右值定义: 左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式). int a; int b; a = 1; b = 2; a = b; b = a; a + b = 3; // 非法表示 右值分为纯右值和将亡值: 纯右值:临时变量和不跟对象关联的字面量值 将亡值:在确保其他变量不再被使用或即将销毁时,通过盗取的方式,可以避免内存空间的释放和分配,能够延长变量值的生命期。右值通常不具有名字,也只能通过引用的方式找到它的存在。 特性

king9666的博客 1316

背靠背VSC直流母线电压控制与同步发电机并网发散问题:原理、分析与解决方案

背靠背VSC直流母线电压控制与同步发电机并网发散问题分析 摘要: 本文研究了背靠背VSC系统在整流侧由理想三相电源切换为同步发电机时出现的直流母线电压振荡和发散问题。通过理论分析发现,锁相环同步失稳、等效阻抗失配和直流母线电容参数失配是导致系统失稳的关键因素。当整流侧接入同步发电机后,系统形成正反馈振荡回路,同时等效电感增大导致电流环响应速度降低,直流侧电容容量不足无法吸收发电机功率波动。文章提出了从跟网型控制到构网型VSG控制的完整升级方案,包含详细的MATLAB/Simulink建模和控制算法实现,并通

huanghm88的专栏 122

如何对EMB电子机械制动器的热衰退问题进行优化

摘要 电子机械制动器(EMB)在新能源汽车和自动驾驶中具有重要应用价值,但其在高强度工况下会出现热衰退现象。本文分析了EMB热衰退的五大机理:摩擦副热效应、电机热衰退、减速机构热失效、温度对控制策略干扰以及结构设计导致的热积累。针对这些问题,提出了从材料、结构、控制三个维度的优化措施:升级耐高温材料、改进散热设计、优化控制算法等。通过"热生成抑制-热传导优化-热失效补偿"的系统方案,可有效改善EMB的热衰退问题,为智能汽车提供更可靠的制动保障。

m0_59012156的博客 342

c++学习笔记(13)-左值和右值

如果能够直接使用临时对象已经申请的资源,并在其析构函数中取消对资源的释放,这样既能节省资源,有能节省资源申请和释放的时间。需要注意的是:右值引用并不能阻止编译器在临时对象使用完之后将其释放掉的事实,所以转移构造函数和转移赋值操作符重载函数 中都将_data赋值为了NULL,而且析构函数中保证了_data!常量左值引用可以绑定到非常量左值、常量左值、非常量右值、常量右值等所有的值类型。右值引用:其实也是绑定到右值的引用,通过&&来获得右值引用。左值引用:其实就是绑定到左值的引用,通过&来获得左值引用。

沸腾了的博客 1189

STM32 HAL SDADC DMA

由于项目需要使用STM32F373单片机的SDADC功能对电位计进行检测,网上资料比较少,踩了很多坑,下面进行总结。

weixin_44597885的博客 1196

C++学习笔记(三)

本文整理了C++编程基础的核心知识点,主要内容包括:1. C++内存管理:详细解析代码区、静态数据区、栈区、堆区的功能特点,介绍内存地址概念及变量存储原理;2. 指针基础:讲解指针的定义与使用、解引用操作、指针类型的内存占用等核心概念;3. const关键字:分析常量变量、常量指针、指针常量等不同用法,区分顶层与底层const;4. 枚举类型:对比传统枚举与C++11强类型枚举(enum class),说明枚举的定义、赋值和使用方法;5. 编程基础:涵盖变量作用域、数据类型、二进制相关概念等基础知识。文章通

ShangguanLuli的博客 1184

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++基础

004.C++里有哪几种数据类型? 答: 大致分为三大类: 一是基本类型,基本类型又包括整型,字符型(char),浮点型,布尔型(bool)。 而整型包括短整型(short int),整型(int),长整型(long int); 浮点型包括单精度型(float),双精度型(double),长双精度型(long double)。 二是派生类型,派生类型又包括指针类型(*),枚举类型(enum),数组...

weixin_44747173的博客 141

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《C++ Primer》 第02章 [ 变量和基本类型 ]

第02章:变量和基本类型 第三节:变量 @ 学习摘录007: ——C++是一门静态类型语言,在编译的时候会作类型检查. @ 学习摘录008: ——左值:lvalue,左值可以出现在赋值语句的左边或右边。 ——右值:rvalue,右值只能出现在赋值的右边,不能出现在赋值语句的左边。 ——变量是左值,因此可以出现在赋值语句的左边,数字字面是右值,因此不能被赋值。 摘录有想008: —

知行天下 511

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

UE4游戏研发C++作业(二)

009.操作符优先级对运算符有什么影响? 指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。 操作符是一个大的计算机概念,如 =(赋值),==(判断相当),+,- 等等都算操作符。 所以操作符的优先级也影响了运算符的优先级。运算符继承了大概念下的操作符的优先级。 操作符优先级 运算符优先级 010.逻辑操作与其他操作的关系。 逻辑操作一般是对二进制数字的操作: 按位...

weixin_44329834的博客 313

C++学习-4-第二篇-20221227-20230103

练习 3.26 在 String 类的构造函数和赋值操作符的实现中 有大量的重复代码 请使用 2.3 节中展 示的模型 把这些公共代码抽取成独立的私有成员函数 用它们重新实现构造函数和赋值操 作符 并重新运行程序以确保其正确。练习 3.24 下列 vector 定义中 哪些是错误的 int ia[ 7 ] = { 0, 1, 1, 2, 3, 5, 8 };枚举类型的对象能够被初始化 但是只能被一个相同枚举类型的对象或枚举成员集中的某个值初始化或赋值.枚举变量的值只能取枚举常量表中所列的值,就是。

weixin_45783317的博客 432

C++ primer 笔记(一)

在一个博客中看到的 整理了一些自己认为有帮助的 点击打开链接 最大收获008: ——左值:lvalue,左值可以出现在赋值语句的左边或右边。 ——右值:rvalue,右值只能出现在赋值的右边,不能出现在赋值语句的左边。 ——变量是左值,因此可以出现在赋值语句的左边,数字字面是右值 最大收获010: ——初始化变量不是赋值。 ——初始化:指创建变量并给它赋初始值。 ——赋值:是擦...

lovecontry 107

C++ALL---

程序的编译与链接_编译和链接-优快云博客【C/C++内功心法】剖析编译链接的过程,探究源文件是如何一步步变成可执行程序,提升C/C++内功_源文件如何编译链接【精选】你知道.c是如何变成.exe的吗_.c生成exe【精选】【计算机系统基础】符号表、符号解析(详解)C++中内存的分配C/C++语言中变量作用域:局部变量,全局变量,文件级变量_c++ 人为增加作用域C语言之宏详解(超级详细!)【精选】“#define & #if & #include & #pragma……”你真的熟悉嘛?(预处理详解)_#p

qq_56762247的博客 392

C/C++知识点整理

【001 关键字】宏定义中的#和##的用法【002 关键字】一文彻底搞懂volatile用法【003 关键字】static关键字在C语言和C++中的使用及区别【004 关键字】extern “C“的作用是什么?【005 关键字】const的作用及使用条件【006 关键字】new/delete与malloc/free的区别是什么? 【007 关键字】strlen(“\0“) sizeof(“\0“) 等于多少?【008 关键字】sizeof和strlen的用法区别?【009 关键字】不使用sizeof关键字,

kashine的博客 407

《C Traps and Pitfalls》 笔记

这本书短短的100多页,很象是一篇文章。但是指出的很多问题的确容易出现在笔试的改错题中 -------------------------------------------------------------------- 第1章 词法陷阱 1.1 = 和 == 1.3 词法分析的"贪心法则" 编译器从左到右读入字符,每个符号包含尽可能多的字符,直到不是字符为止 如:...

weixin_30408309的博客 87

C 语言学习笔记

B站up Micro_Frank C语言大师系列课程笔记

g_c_m_g的博客 1223

C++ 左值与右值(Lvalue/Rvalue)全解析

本文详细解析了C++中左值与右值的核心概念及其应用。左值是有名称、可寻址的持久对象,右值则是临时、无名称的短期对象。C++11引入右值引用(T&&)后,进一步细分为纯右值和将亡值,支持移动语义和完美转发。通过代码示例展示了左值引用与右值引用的区别,重点阐述了移动语义如何避免大对象拷贝,提升性能。文章还分析了函数参数中的值匹配规则,并提供了核心特性对比表,帮助开发者深入理解这一重要概念。

2301_80136889的博客 689

c++中的左值与右值的区别

左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/forward 等新语义的基础。 左值右值的定义 左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能

lxx_WHU的博客 1065
上一篇: 【C++】013、空类占多少字节?
下一篇: 【C++】015、函数参数:值传递,指针传递,引用传递的区别
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值