C++标准库功能:Xvalue,prvalue和Lvalue

C++ 左值、右值、左值引用、右值引用 本文介绍C++11的各种引用的概念,理解清楚各种引用的概念,非常有助于理解基于c11引用的各种操作。 阅读详情

学习cpp11之后,对左值和右值的分类。
在这里插入图片描述
先看一个简单的分类:
在这里插入图片描述
更加详细的分类。这里我把Xvalue(ex)翻译成将亡值吧,直观好理解。Prvalue(pure right value)是纯右值。
1.有引用,不将亡  2.有引用,将亡 3.没有引用,将亡

glvalue(泛左值) = lvalue (传统意义上的左值)+ xvalue(消亡值,通过右值引用产生)
rvalue (传统意义上的右值) = prvalue(纯右值) + xvalue

在这里插入图片描述

一个例子 在这里插入图片描述

在这里插入图片描述
在这里,prvalue()函数得到一个纯右值,因为没有赋值到其他变量,没有实体,可以被移动。
lvaue()函数是一个左值,因为有引用指向他,有实体,不可以被移动。
xvalue()是定义得右值,有实体,可以被移动。

总结
  1. 简单的来说,能取地址的变量一定是左值,有名字的变量也一定是左值,最经典的void fun(p&& shit),其中shit也是左值,因为右值引用是左值(所以才会有move,forward这些函数的产生,其中move出来一定是右值,forward保持变量形式和之前的不变,就是为了解决右值引用是左值的问题)。

  2. 至于为什么不能把等号左边看成左值,因为在C++中,等号是可以运算符重载的,等号完全可以重载成为等号左边为右值的形式。

  3. 纯右值是传统右值的一部分,纯右值是表达式产生的中间值,不能取地址。

  4. 本质上,消亡值就是通过右值引用产生的值。右值一定会在表达式结束后被销毁,比如return x(x被copy以后会被销毁), 1+2(3这个中间值会被销毁)。

参考资料
  1. https://www.cnblogs.com/Philip-Tell-Truth/p/6370019.html?utm_source=itdadao&utm_medium=referral
  2. https://en.cppreference.com/w/cpp/language/value_category
什么是右值(rvalues)、左值(lvalues)、将亡值(xvalues)、泛左 ISOC++11(正式名称为 ISO/IEC 14882:2011)是 C++ 编程语言标准的最新版本,它引入了一些新特性和概念,如右值引用、xvalue、glvalue、prvalue 表达式值类别以及移动语义。这些新的表达式值类别概念的引入,与右值和左值引用密切相关,并且右值可以传递给非 const 右值引用。为了理解这些概念,我们需要深入探讨各个值类别的定义和特点。 阅读详情

相关推荐

理解C++值类别(lvalue, rvalue, prvalue, xvalue)

本文详细解析C++值类别的演进与应用, 涵盖左值, 右值, 纯右值及将亡值的概念及其在现代C++中的作用. 通过学习右值引用与移动语义, 开发者可以优化资源管理, 减少不必要的拷贝操作, 从而提高程序性能. 适合希望深入了解C++底层机制的开发者阅读.

一些C++相关的技术笔记或者教程. 1092

C++右值引用,左值(lvalue)、将亡值(xvalue)、纯右值(prvalue)

右值引用 C++11增加了移动特性(把资源所有权交出给新对象),基于两个原因: 在很多时候,对象拷贝后就立即被销毁了,此时移动而非拷贝对象会大幅度提升性能。 一些类(比如IO类、unique_ptr)包含不能被共享的资源(IO缓冲、指针),所以这些类型的对象不能被拷贝,但可以被移动。 因此引出新的引用类型——右值引用:必须绑定到右值的引用。我们通过 &&来获得右值引用。 右值引用有一个重要性质——只能绑定到一个将要摧毁的对象。因此可以自由地将一个右值引用资源移动到另一个对象。 右值、左值

qq_40586164的博客 4344

C++左值与右值深度解析:从基础概念到移动语义实战

在C++编程中,理解表达式的值类别是掌握现代C++核心特性的基础。左值和右值作为值类别的核心概念,定义了表达式的身份、生命周期和可操作性,是编译器进行资源管理和优化决策的基石。从原理上看,左值代表具有持久身份的表达式,通常可以取地址;而右值代表可移动的临时表达式,其资源可以被高效转移。这一区分在现代C++中具有重要技术价值,它直接支撑了移动语义和完美转发两大关键特性,能够显著提升程序性能,避免不必要的深拷贝。在实际应用场景中,通过右值引用和std::move实现移动语义,可以优化容器操作、资源管理类和大对象

diaohuyi6830的博客 369

右值、将亡值、纯右值与强转后的值类别

1、强转后的值一定为右值。2、强转为内置类型则为纯右值,强转为设计的类型则为将亡值。3、与强转前的值类型无关,只与强转后的值有关。4、内置类型包括char、short、int、long、float、long long、double以及指针(无论是内置类型的指针还是自己设计的类型指针,均为内置类型)

dyyfyyds_的博客 651

[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]

场景: 1. C++11 引入了std::move,它可以高效率的从一个左值资源移动到另一个左值资源里, 这个过程不需要再创建新的资源. 这对std::string,std::vector这种标准库的资源 操作更加精炼.使用标准库时会大量使用这个std::move模板函数. 2. 在std::move的源码里又涉及到std::remove_reference 模板结构体,这个结构体又涉及到 "右值引用声明(Rvalue Reference Declarator: &&)", 所以这里还是讲

小白 3335

绿盾注册机 使用手册

在很多涉及工程设计的单位(如建筑、模具、电路、广告等),电子图纸的应用极为普遍,而电子图纸的丢失、被盗对企业利益的影响是显而易见的,如果被竞争对手获取,甚至可能造成致命的打击。因此,对于这类企业,电子图纸的保密显得至关重要。绿盾信息安全管理软件充分考虑了电子图纸的各种可能传播途径,制定了针对性的解决方案,从而保证了电子图纸的安全。 我们总结了电子图纸的各种传播途径以及相应的对策,有如下几点:

996

用反汇编分析c++RVO开启和关闭时的底层原理以及C++prvalue,xvalue和lvalue的相关知识

用反汇编分析c++RVO开启和关闭时的底层原理 前言 本篇文章主要讲述C++prvalue,xvalue和lvalue的相关知识,会用到部分intel式和ATT式汇编的知识。我会在文章末尾给出测试代码的反汇编代码以及右值引用(Rvalue references)官方文档 。

Howl_1的博客 1935

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 471

C++ 移动语义与完美转发深度解析:从零拷贝到零开销抽象

移动语义和完美转发并非 C++ 的语法糖,而是类型系统和资源管理模型的一次根本性进化。值类别 ≠ 类型:理解 lvalue / xvalue / prvalue 的区分是掌握移动语义的心智前提std::move 是类型转换,不是运行时操作:它改变编译期决策,不影响运行时行为std::forward 保留值类别,std::move 强制转为 rvalue:选择取决于你的语义意图。

ITOfDragon的博客 1608

记一次wireshark抓取QQ好友IP和火绒抓取微信IP

事情是这样的,,上个周,手机离奇的被盗,但没有关机,为了找回手机,粗学了一手QQ抓ip的手段。 这里我就直接做个演示,解析关键的点。 三种思路i. wireshark 抓取手机在线IPii 火绒抓取 微信在线接听IPiii 火绒抓取 微信在线不接听IP i. wireshark 抓取手机在线IP wireshark抓好友QQ的ip要求和对方打语音的时候要手机在线。 这里说一下,打语音和视频是直接能和对方建立连接,如果发文件,是直接发给腾讯的,抓不到包。 1.打开wireshark,通过电脑Tim给对方打语音

qq_29437513的博客 1万+

用C++从零复刻Wordle:手把手教你实现命令行猜词游戏(含完整源码解析)

本文详细介绍了如何使用C++从零开始实现一个命令行版本的Wordle猜词游戏,包含完整的源码解析和核心模块设计。通过游戏逻辑控制器、单词库管理器等模块的构建,开发者可以学习C++实战技巧和性能优化方法,适合提升编程能力和游戏开发兴趣。

weixin_26763955的博客 333

[cpp32 note] 3. 右值和移动

void bar(T&& s)中,T&&的作用主要是保持值类别进行转发,也叫转发引用(forwarding reference)。这里的ptr1是左值引用,std::move的作用是将左值引用转变为右值引用,std::move(ptr1)的结果是指向ptr1的一个右值引用。很多标准库里的函数,连目标的参数类型都不知道,但仍然能保持参数的值类别:左值的仍然是左值,右值的仍然是右值。如果T是左值引用,那么T&&的结果仍是左值引用,即(type&)&&右值引用变量,实际上是一个左值,因此会匹配到左值引用上。

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 150

基于Simscape的双PID比例调速阀与比例溢流阀液压控制系统建模与仿真

本文提出了一种基于Simscape的双PID液压控制系统建模方法,通过比例调速阀和比例溢流阀实现液压缸速度与压力的解耦控制。系统采用Simscape Fluids物理建模,精确模拟液压元件非线性特性。文章详细介绍了液压被控对象建模过程,包括动力单元、比例阀组合建模、执行机构及传感器配置。同时设计了双PID控制器架构,分别控制速度环和压力环,并给出参数整定建议。该方法通过物理网络直接模拟流体流动和压力动态,相比传统传递函数法具有更高精度,为液压系统仿真提供了有效解决方案。

AI的内部世界的博客 284

详解C++中移动语义的概念与使用

回顾文首的示例代码,由于 C++ 11 加入了返回值优化 RVO(Return Value Optimization) 的特性,所以代码无需变更即可获得效率提升。对于部分编译器而言,比如 IBM Compiler、Visual C++ 2010 等,已经提前具备返回值优化的支持。

m0_74824496的博客 64

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1548

C++11类型推导与完美转发:深入理解引用折叠与可变参数模板

在C++泛型编程中,类型推导是编译器自动推断表达式类型的基础机制,它使得模板代码更加简洁灵活。其核心原理涉及模板参数推导规则和引用折叠机制,后者是理解万能引用的关键。这项技术的核心价值在于实现类型安全的通用代码,避免重复逻辑,同时保持运行时效率。典型应用场景包括编写通用库函数、工厂方法和容器适配器,例如实现类似标准库的emplace操作。通过掌握引用折叠规则,开发者可以正确实现完美转发,确保参数的值类别和常量性在传递过程中保持不变。结合可变参数模板,能够处理任意数量和类型的参数,这正是现代C++中std::

weixin_30905133的博客 431

YOLOv11改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 778

C++左值与右值:从变量生命周期到移动语义

在C++编程中,理解左值(lvalue)和右值(rvalue)是掌握现代C++特性的基础。左值代表有持久内存地址的对象,而右值则是临时对象。通过值类别的区分,C++实现了高效的资源管理。右值引用(rvalue reference)作为C++11的关键特性,为移动语义(Move Semantics)和完美转发(Perfect Forwarding)提供了基础,显著提升了程序性能。这些技术特别适用于处理大型数据结构或资源密集型对象,如游戏开发和科学计算领域。理解变量生命周期和内存状态,是优化C++代码的重要一步

weixin_32821533的博客 238

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++左值和右值

https://en.cppreference.com/w/cpp/language/value_category C++中的每个表达式都有两种独立的特性:类型(type)和值分类(value category)。每个表达式都属于三大value category之一:prvalue,xvalue和lvalue。值分类的隶属关系如下图: a glvalu...

weixin_30404405的博客 269

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

右值引用与移动语义:从拷贝到移动的范式革命

std::cout << "Buffer 移动赋值 from size=" << size_ << "\n";std::cout << "Buffer 移动构造 from size=" << size_ << "\n";

如风逝去 366

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++左值右值深度解析:从基础概念到移动语义与完美转发实践

在C++编程中,理解表达式的基本属性是掌握高效编程的关键。从编译器的视角看,表达式根据其身份和生命周期被划分为不同的值类别,这直接影响了对象的拷贝、传递和资源管理方式。左值代表有持久身份的对象,可以取地址;而右值通常是临时对象,为资源优化提供了可能。基于这一原理,C++11引入了移动语义和右值引用,允许将临时对象的资源“转移”而非拷贝,显著提升了包含动态内存、文件句柄等资源的对象在传递和返回时的性能。这一技术在现代C++库中广泛应用,例如std::vector的扩容操作和emplace_back方法都依赖于

weixin_34327761的博客 830

C++左值、右值与移动语义:从概念到性能优化的完整指南

在C++编程中,理解值类别和引用机制是掌握现代C++高效资源管理的基础。左值和右值的核心区别在于表达式是否具有持久存储位置和可移动性,这直接影响了对象的生命周期和资源所有权。通过引入右值引用和移动语义,C++11实现了对临时对象资源的安全高效转移,避免了不必要的深拷贝,从而显著提升了程序性能。这一特性在标准库容器、自定义资源管理类以及函数参数传递等场景中具有重要价值。本文以std::move和移动构造函数为例,深入探讨了移动语义的实现原理及其在工程实践中的应用,帮助开发者编写更高效的C++代码。

weixin_30325487的博客 384

现代 C++ 资源所有权与参数转发机制深度研究报告:std::move 与 std::forward 的理论架构、底层实现与工程实践

摘要: 现代C++通过std::move和std::forward实现了资源所有权转移和参数完美转发。std::move本质是将左值强制转换为右值引用,触发移动语义;std::forward则根据模板参数保持参数的原始值类别。二者基于C++11引入的值类别体系(lvalue/xvalue/prvalue)和引用折叠规则实现。工程实践中,它们可优化性能并明确资源所有权流向,尤其适用于工厂函数等场景。正确使用这些特性需要深入理解其底层机制,避免误用导致的性能损失或逻辑错误。

greenspan的专栏 1075

现代c++编程c++11/14/17/20:Chapter 03: Language Runtime Enhancements

3.1 Lambda Expression Lambda表达式是现代c++中最重要的特性之一,而Lambda表达式实际上提供了一个类似于匿名函数的特性。匿名函数在需要函数时使用,但您不希望使用名称调用函数。实际上有很多很多这样的场景。所以匿名函数几乎是现代编程语言的标准。 3.1.1 Basic Lambda表达式的基本语法如下: [capture list] (parameter list) mutable(optional) exception attribute -> return type {

叶子心情你不懂 387

C++左值右值引用与移动语义:从基础概念到高效编程实践

在C++编程中,理解表达式的值类别是掌握高效资源管理的关键。左值代表有身份、可寻址的持久对象,而右值则代表临时的、可移动的数据。基于这一原理,C++引入了左值引用和右值引用两种机制,左值引用为对象提供别名,右值引用则支持移动语义,允许高效转移临时对象的资源。这一技术价值在于显著提升程序性能,特别是在处理动态内存、容器和大型对象时,能避免不必要的深拷贝。应用场景广泛,包括实现移动构造函数、移动赋值运算符,以及在泛型编程中通过完美转发实现高效参数传递。本文深入探讨了左值、右值、移动语义及引用折叠等核心概念,并通

weixin_33698823的博客 352
上一篇: C++标准库功能:std::move
下一篇: Weekly Contest 174
dlvector
博客等级 码龄10年 85粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值