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

右值和右值引用学习笔记

cpp新特性之右值

  • 右值和右值引用
  • 右值引用的作用以及使用
  • 未定引用类型的推导&&
  • 右值引用的传递

右值和右值引用

左值(lvalue-loactorvalue ):存储在内存中,有明确存储地址(可取地址)的数据 右值(rvalue-readvalue):可以提供数据值的数据(不可取地址)
intmain(){//左值intnum=9;//左值引用int&a=num;//右值//右值引用int&&b=8;//常量左值引用constint&c=num;constint&f=b;//ok,右值引用来初始化常量左值引用constint&g=d;//欧克,常量右值引用来初始化常量左值引用//常量右值引用constint&&d=6;constint&&e=e;//errorint&&f=b;//error//可见右值引用只能用右值初始化(纯右值或者将亡值)}

右值引用的作用以及使用

#include<iostream>usingnamespacestd;int&&value=520;classTest{public:Test(){cout<<"调用构造函数"<<endl;cout<<"m_num地址"<<&m_num<<endl;}Test(constTest&a):m_num(newint(*a.m_num)){cout<<"调用拷贝构造函数"<<endl;}//移动构造函数->复用其他对象中的堆内存//m_num,浅拷贝Test(Test&&a):m_num(a.m_num){a.m_num=nullptr;cout<<"调用移动构造函数"<<endl;}~Test(){cout<<"调用析构函数"<<endl;deletem_num;}int*m_num;};TestgetObj(){Test t;returnt;}TestgetObj1(){returnTest();//(这个临时对象不能被取地址),因此使用匿名对象}Test&&getObj2(){returnTest();}//getObj1和getObj2返回的对象都是是(右值(纯右值,将亡值))将亡值(即将被释放的不能取地址的临时对象,或者是std::move的返回值)intmain(){//要求右侧的对象是一个临时对象,才会调用移动构造函数//如果没有定义移动构造函数,会调用拷贝构造函数Test t=getObj();cout<<"============="<<endl;Test&&t1=getObj();cout<<"m_num地址"<<&t1.m_num<<endl;//如果没有移动构造函数,使用右值引用初始化要求更高(这个临时对象不能被取地址)Test&&t2=getObj1();//这种方式复用了匿名对象的所有资源,cout<<"m_num地址"<<&t2.m_num<<endl;return0;}

未定引用类型的推导&&

在c++中,并不是所有的情况&&都代表右值引用,
在模板:T&& ( const T&& 表示右值引用)
在自动类型推导:auto &&
这两种情况下为: 未定引用类型

通过右值推导T&&或者 auto&&得到的是 右值引用 类型 通过非右值(右值引用,左值,左值引用,常量右值引用,常量左值引用)推导 T&&或者 auto&&得到 左值引用类型

右值引用的传递

#include<iostream>usingnamespacestd;voidprintValue(int&i){//左值引用cout<<"l_value"<<i<<endl;}voidprintValue(int&&i){//右值引用cout<<"r_value"<<i<<endl;}voidforward(int&&k){//右值引用传递了,导致k变成了一个左值类型(具名化)printValue(k);//因此这个函数打印左值}intmain(){inti=520;printValue(i);//l_value 520printValue(1314);//r_value 1314forward(1314);//l_value 1314retrun0;}
1.左值和右值是独立于他们的类型的,右值引用类型可能是左值也可能是右值2.编译器会将已经命名的右值引用视为左值,将未命名的右值引用视为右值3.右值引用被推导或者被传递之后,对应的就是一个左值或者右值
http://www.jsqmd.com/news/619651/

相关文章:

  • 别再浪费定时器了!用STM32F4的TIM4输出比较模式,一个定时器搞定四路独立PWM(附步进电机控制代码)
  • 2026年工业仿真动画优质服务商推荐榜:三维动画、机械动画、设备动画、三维仿真动画、工艺原理动画公司,幻像空间领衔精品动画制作 - 海棠依旧大
  • cmake之旅(2)
  • STM32嵌入AI模型实战指南
  • 打造沉浸式智能AI问答助手:Vue + UniApp 全端实战(支持 Markdown/公式/多模态交互)夹
  • 避坑指南:QTableWidget中使用QCheckBox时容易忽略的5个细节问题
  • 避坑指南|2026靠谱GEO服务商推荐 - 品牌测评鉴赏家
  • Spring Boot + Redis 缓存优化方案,解决 Redis 缓存的三大经典问题
  • 学习dp入门
  • 3步打造轻量Windows 11:tiny11builder精简系统实战指南
  • SGLang实战:如何用Python DSL编写带分支的LLM生成任务(附完整代码)
  • 喔去,litellm 竟然被投毒了,赶紧检查你的机器中招了没有侥
  • 物联网云平台工业设备对接远程控制数据采集视频接入开源可二次开发 该物联网云平台使用 Java ...
  • 如何用OnmyojiAutoScript实现阴阳师全自动托管:每天节省2小时游戏时间的完整指南
  • 互联网企业项目管理的核心挑战
  • 基于MPC的模型预测轨迹跟踪控制联合仿真simulink模型+carsim参数设置 效果如图
  • 短剧付费转化系统设计:试看 + 阶梯定价 + 会员锁客全链路
  • 智慧农业无人机数字孪生系统源码:基于WebGL的3D农场可视化平台
  • 我想在豆包做广告,联系谁?第三方豆包优化方案助您精准获客 - 品牌2026
  • 扔给 AI 自动部署!Wazuh 安全监控平台 - 一键部署提示词
  • 【可信计算】TPM2-tools实战:从文件度量到完整性验证
  • SpringSecurity(3)学习内容
  • fre:ac音频转换器:3大核心功能让你的音乐管理焕然一新
  • 从Vivado工程到上电自启:ZYNQ7020双核ARM+FPGA的完整启动流程详解
  • EC-QA-04-质量问题跟踪表
  • 3分钟掌握G-Helper:终极华硕笔记本性能优化指南
  • 单相全桥逆变器Simulink仿真分析与MATLAB实现探索
  • 智能销售辅助在机械设备行业转化率突破:从经验依赖到AI赋能的革命性转型
  • 基于单片机控制的汽车电动车窗
  • 现在不重构组织,Q3将面临AI人才断层潮:SITS2026圆桌披露的21天敏捷转型启动清单