C++ 左值、右值、右值引用

【C++】右值引用(极详细版) 右值引用的两个价值;万能引用和完美转发 阅读详情

看到这个type-id && cast-expression ,对于熟悉C语言的我有点发懵。
感觉就是C++的概念确实比C语言繁杂细腻的多,这个右值,就是非常的细腻区分变量的生存时间和内存的使用的概念,有必要理解清楚。

左值、右值

在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。

右值、将亡值

在理解C++11的右值前,先看看C++98中右值的概念:C++98中右值是纯右值,纯右值指的是临时变量值、不跟对象关联的字面量值。临时变量指的是非引用返回的函数返回值、表达式等,例如函数int func()的返回值,表达式a+b;不跟对象关联的字面量值,例如true,2,”C”等。

C++11对C++98中的右值进行了扩充。在C++11中右值又分为纯右值(prvalue,Pure Rvalue)和将亡值(xvalue,eXpiring Value)。其中纯右值的概念等同于我们在C++98标准中右值的概念,指的是临时变量和不跟对象关联的字面量值;将亡值则是C++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(移为他用),比如返回右值引用T&&的函数返回值、std::move的返回值,或者转换为T&&的类型转换函数的返回值。

将亡值可以理解为通过“盗取”其他变量内存空间的方式获取到的值。在确保其他变量不再被使用、或即将被销毁时,通过“盗取”的方式可以避免内存空间的释放和分配,能够延长变量值的生命期。

左值引用、右值引用

左值引用就是对一个左值进行引用的类型。右值引用就是对一个右值进行引用的类型,事实上,由于右值通常不具有名字,我们也只能通过引用的方式找到它的存在。

右值引用和左值引用都是属于引用类型。无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。左值引用是具名变量值的别名,而右值引用则是不具名(匿名)变量的别名。

左值引用通常也不能绑定到右值,但常量左值引用是个“万能”的引用类型。它可以接受非常量左值、常量左值、右值对其进行初始化。不过常量左值所引用的右值在它的“余生”中只能是只读的。相对地,非常量左值只能接受非常量左值对其进行初始化。

int &a = 2;       # 左值引用绑定到右值,编译失败

int b = 2;        # 非常量左值
const int &c = b; # 常量左值引用绑定到非常量左值,编译通过
const int d = 2;  # 常量左值
const int &e = c; # 常量左值引用绑定到常量左值,编译通过
const int &b =2;  # 常量左值引用绑定到右值,编程通过
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

右值值引用通常不能绑定到任何的左值,要想绑定一个左值到右值引用,通常需要std::move()将左值强制转换为右值,例如:

int a;
int &&r1 = c;             # 编译失败
int &&r2 = std::move(a);  # 编译通过
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

下表列出了在C++11中各种引用类型可以引用的值的类型。值得注意的是,只要能够绑定右值的引用类型,都能够延长右值的生命期。 
这里写图片描述

右值引用支持移动语义的实现,这可以显著提高应用程序的性能。 利用移动语义,您可以编写将资源(如动态分配的内存)从一个对象转移到另一个对象的代码。 移动语义很有效,因为它使资源能够从无法在程序中的其他位置引用的临时对象转移。

若要实现移动语义,您通常可以向您的类提供移动构造函数,也可以提供移动赋值运算符 (operator=)。 其源是右值的复制和赋值操作随后会自动利用移动语义。 与默认复制构造函数不同,编译器不提供默认移动构造函数。



C++11 新特性 ② | 左值、左值引用、右值与右值引用 详细讲述左值、左值引用、右值与右值引用相关概念。 阅读详情

相关推荐

实测避坑:用SGM61720做BUCK电路,SW引脚电压尖峰怎么压下去?

本文针对SGM61720在BUCK电路中SW引脚电压尖峰问题,提供实测避坑指南。通过分析电压尖峰、过冲等核心问题,详细讲解自举电阻调整、RC缓冲电路计算和PCB走线优化三大解决方案,帮助工程师有效降低SW引脚电压尖峰,提升系统稳定性和EMI性能。

weixin_42634811的博客 213

【基础知识】C++左值右值

C++中,并不是所有情况下 && 都代表右值引用,在模板和自动类型推导(auto)中,如果是模板参数,想要指定为 T&&,如果是自动类型推导,需要指定为 auto&&,这两种情况下,&& 被称作“未定的引用类型”。C++11 添加了右值引用,却不能左值初始化右值引用,在一些特定的情况下免不了需要左值初始化右值引用(用左值调用移动构造),如果想要用左值初始化一个右值引用,想要借助 std::move() 函数,move() 函数可以。当 T 不是左值引用类型时,t 将会被转换为 T 类型的右值。

m0_56573171的博客 3504

直流电动机的建模仿真(1)他励,串励和并励电动机建模仿真

本文根据不同励磁方式的直流电动机的接线原理图,建立了相应的数学模型,然后根据与数学模型对应的等效电路以及模拟机械运动方程的等效电路,用Matlab/simulink中的SpecializedPower system库中的电路元件,建立了他励,并励和串励直流电动机的全等效电路仿真模型,经过与Matlab自带的直流电动机仿真模型比较以及仿真实例验证,所建立的仿真模型时完全正确的。

weixin_45670943的博客 7519

C++ 左值与右值

本文系统介绍了C++中左值与右值的核心概念及其应用。左值是可寻址、可修改的持久对象,右值是不可寻址的临时值。重点讲解了右值引用(std::move)和完美转发(std::forward)的实现原理:右值引用通过移动语义避免不必要的拷贝,完美转发保持参数原始值类别。通过代码示例对比了移动语义与深拷贝的区别,并分析了返回值优化(RVO)的触发条件。文章还指出std::move会将对象强制转换为右值,而std::forward能保持参数的左右值属性,两者在模板编程中各有适用场景。这些特性共同构成了现代C++高效资

人无远虑,必有近忧 4766

GEOSHIELD:分布式CPS的拜占庭容错与安全防护技术

分布式系统在关键基础设施(如轨道交通、智能电网)中面临网络延迟和恶意节点的双重挑战。拜占庭容错(BFT)技术通过算法保证系统在存在故障节点时仍能达成一致,是保障系统安全的核心机制。GEOSHIELD创新性地结合概率化网络延迟测量和TGS动态信任评分,实现了不依赖可信硬件的拜占庭 resilience。该技术通过建立节点行为的信用档案,动态识别恶意行为,在保证安全性的同时最大化系统可用性。实验证明,即使在自适应攻击策略下,GEOSHIELD仍能保持系统95.6%的正常运行时间,为CPS系统提供了可靠的安全防护

weixin_31766003的博客 346

Docker部署OnlyOffice踩坑实录:解决editor.bin下载失败的3种姿势

本文详细解析了Docker部署OnlyOffice时editor.bin下载失败的常见原因,并提供了三种核心解决方案。重点剖析了容器网络配置、Nginx反向代理(特别是proxy_pass设置)以及安全策略调整,帮助开发者彻底解决静态资源加载问题,确保文档协作平台稳定运行。

weixin_29281941的博客 872

【C++】C++11语法之右值引用

关于C++11新语法的一些理解以及对其中右值引用的使用的讲解。

jhao的博客 5610

多模态目标检测综述介绍及框架提供

多模态目标检测是计算机视觉领域的前沿方向,旨在通过融合不同传感器或数据源的信息(如可见光、红外、深度等),提升复杂场景下目标检测的准确性和鲁棒性。

Limiiiing的博客 4588

C++右值

在C++中引入右值(rvalue)的概念主要是为了更好地优化资源管理、提高性能以及支持移动语义(move semantics)。右值是的概念C++11标准引入的重要特性之一,它与左值(lvalue)一起构成了C++中值类别(value category)的基础。以下详细解释引入右值概念的原因及其带来的好处在C++中,右值(rvalue)是指那些临时、短暂存在且没有持久内存地址的表达式。临时性:右值通常是临时生成的值,如字面量(如5、“hello”)、算术表达式结果(如a + b)或函数返回的临时对象。

m0_45371381的博客 1075

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2070

cefshap(C#)定义浏览器的右键菜单

菜单效果:复制(自带),搜索文本,打开链接,复制链接,刷新,检查,关于 public class MenuHandler : IContextMenuHandler { //public event Action<string> PopupRequest; void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrows

无线智能模块 可视DIY智能专家 1705

详解 C++ 左值、右值、左值引用以及右值引用

主要讲解了 C++11 的右值引用(及其支持的移动语义和完美转发)。

Butayarou的博客 2万+

什么是信噪比?信噪比越大好还是越小好?

在进行声音增强的时候,往往需要考虑声音信号和噪声的信噪比,那么信噪比是什么呢?越大越好还是越小越好,此处引入百度百科的解读: 信噪比,英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO),又称为讯噪比。是指一个电子设备或者电子系统中信号与噪声的比例。这里面的信号指的是来自设备外部需要通过这台设备进行处理的电子信号,噪声是指经过该设备后产生的原信号中并不存在的无规则的额外信号(或信息),并且该种信号并不随原信号的变化而变化。 同样是“原信号不存在”还有一种东西叫“失真”,失真和噪声实际上有一

码匀的博客 7万+

c++——左值、右值、左值引用、右值引用

1、左值和右值 左值(left-values),缩写:lvalues 右值(right-values),缩写:rvalues 直接上官网查,我一向倡导自己去懂得原理,而原理都是老外写的,当然我只是针对c++编程语言这样说。 https://msdn.microsoft.com/en-us/library/f90831hc.aspx 翻译:所有的c++表达,不是左值就是右值。 lvalu...

coco的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ 左值引用与右值引用超详解

左值一般为我们自己定义的变量,在定义时开辟了内存,我们可以对这块内存赋值,修改内存中的值,如果有const也仅从语法层面上不允许修改,这块内存在其生命周期结束的时候销毁。右值一般为临时变量,是程序运行时产生的中间产物,他不是我们用户自己定义开辟空间的,是由编译器帮我们开辟空间,并且在用完就立即销毁。右值的生命周期一般只在当前语句,当我们要对右值进行赋值时,他已经释放空间了,此时我们再进行访问就是野访问,(与野指针一样造成内存问题),所以我们不能对右值进行修改,编译器强制语法检查,遇到修改操作就报错。

2301_79964905的博客 6381

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++ 右值 左值引用

在C++11前都是在mian()函数中定义ret再传给operator+(),延长生命周期。这时候就需要forward<T>()完美转发,保持参数属性,左值还是左值,右值还是右值。因为在传参时右值变为了左值,导致调用Fun()函数时t参数的属性永远是左值。注意区分右值引用和万能引用:下面的函数的 T&& 并不是万能引用,的 && 表示右值引用(比如:int&& ,string&&),将一个对象的资源转到另一个对象上。中的 && 不表示右值引用,而是。首先我们要了解什么是万能引用。为什么都调用的左值引用呢?

wws7920的博客 1808

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++左值、右值、左值引用、右值引用

#include <iostream> #include <vector> #include <string> #include<utility> using namespace std; class A { public: A() { a = 666; cout << "构造A" << endl; } A(const A&a) { cout << "拷贝构造A" << endl; .

DayDayUp 3430

C++左值引用及右值引用

这里的临时对象是肯定会被销毁的,如果能够将临时对象的资源直接移交给接收对象,那么就可以减少一次拷贝。在 C++11标准产生之前,是没有右值引用这个概念的,当时如果想要一个类型既能接收左值也能接收右值的话,需要用const左值引用,比如标准容器的 push_back 接口:void push_back (const T& val)。右值引用 rr2 引用右值 x + y 后,该表达式的返回值被存储到特定的位置,不能取表达式返回值 x + y 的地址,但是可以取 rr2 的地址,也可以修改 rr2。

u010371321的博客 1006

C++ 左值引用和右值引用

1、引用是别名2、声明时必须初始化3、通过引用修改变量4、引用的本质是指针常量三、区分左值和右值1、左值可以在等号左边,能够取地址,具名;比如变量名、返回左值引用的函数调用、前置自增/自减、赋值运算符、解引用等2、右值只能在等号右边,不能取地址,不具名;右值分为纯右值和将亡值,纯右值比如字面值、返回非引用类型的函数调用、后置自增/自减等1、将亡值是C++11引入的一种新的引用类型,用于支持移动语义的实现;2、在C++中,表达式具有值的属性,可以分为左值和右值。

weixin_51795597的博客 1694

C++左值、右值、左值引用、右值引用的详解

左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。

咸鱼爱幻想的博客 1111

详解 C++ 左值和右值对象 左值引用和右值引用

左值 (lvalue):左值是“locator value”的缩写,表示可以定位到内存地址的实体。通常是可以被赋值的对象,比如变量。左值有持久的身份(identity),可以在程序中被多次访问。右值 (rvalue):右值是“right value”的缩写,表示临时或短暂的值,通常不能被直接赋值。右值没有持久的身份,通常是表达式计算的中间结果或字面量。左值引用是用符号声明的引用,它只能绑定到左值。左值引用是 C++98 中就有的特性,用于避免对象拷贝或修改原始对象。右值引用是用&&

cxyhjl的博客 915

C++左值与右值及引用的总结

本文深入解析了C++中的左值(lvalue)和右值(rvalue)概念,重点介绍了现代C++引入的右值引用机制。左值代表具名持久对象,右值则是临时值。右值引用(&&)允许高效处理临时对象,实现移动语义以避免不必要的拷贝。文章详细阐述了值类别系统、引用绑定规则、移动构造函数/赋值运算符的实现及优势,并指出了常见陷阱和最佳实践。这些概念是掌握现代C++高效编程的核心,对性能优化和资源管理至关重要

2401_88413914的博客 1243

C++ 左值、右值、左值引用、右值引用

一、左值右值 1.1 定义 在C++中有几个晦涩的概念:左值、右值、泛左值、纯右值、将亡值 泛左值=左值+将亡值; 右值=纯右值+将亡值; 我们可以发现将亡值既属于泛左值又属于右值; 这些分类是由于它们具有不同性质而命名的,但其实我们只需要掌握左值和右值的概念就已经足够了。 这5种值类型我总结了一张表格,如下: 首先这几个名词用来形容一个表达式,在C++中,一切表达式都必然属于左值、将亡值、纯右值中的一种。而右值=将亡值+纯右值,所以我们又可以说一切C++表达式都必然要么是左值要么是右值。

茶佬牛逼 857

C++面试 左值、右值、左值引用、右值引用

1、左值和右值 左值(left-values),缩写:lvalues ,located value 可定位值,其含义是可以明确其存放地址的值,更确切说对其的使用是基于地址 右值(right-values),缩写:rvalues , read value 可读的值,通常指代赋值运算=右侧的常量值,字面值,或者函数的返回值,它们没有具体的指代名,即无法通过地址访问,通常在赋值表达式结束后变销毁。 一般可以认为:左值对应变量的地址,右值对应变量的值,首先说左值和右值,他们绝不是简单的等号左边和右边的..

u014430031的博客 4114
上一篇: MFC中句柄和指针的区别
下一篇: 比goto跳转的更远的函数
芯片之美
博客等级 码龄10年 33粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值