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

【C++新特性】右值引用

右值和右值的区别


C++11 中右值可以分为两种:一个是将亡值( xvalue, expiring value),另一个则是纯右值( prvalue, PureRvalue):

  1. 纯右值:非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和 lambda 表达式

  2. 将亡值:与右值引用相关的表达式,比如,T&&类型函数的返回值、 std::move 的返回值等。


区分左值与右值的便捷方法是:可以对表达式取地址(&)就是左值,否则为右值 。所有有名字的变量或对象都是左值,而右值是匿名的。

​ 但右值引用延长了右值的生命周期,使用上相当于左值


例子1:

#include <iostream>
using namespace std;int main()
{//左值int num = 9;//左值引用int& a = num;//右值//右值引用int&& b = 8;//常量左值引用const int& C = num;//常量右值引用const int&& d = 6;/*const int&& e = b;	// error,右值引用只能通过右值初始化int && f = b		// error,右值引用只能通过右值初始化*/// 右值引用延长了右值的生命周期,相当于左值,可以给常量左值引用赋值。const int& g = b;const int& h = d;const int & i = a;int & j = b;return 0;
};

规则:

  1. 右值引用延长了右值的生命周期,使用上相当于左值
  2. 左值不能初始化右值引用。
  3. 右值只能初始化右值引用。


&& 的特性

例子2:

template<typename T>
void f(T&& param);
void f1(const T&& param);
f(10); 	
int x = 10;
f(x); 
f1(x);	// error, x是左值,左值不能初始化右值引用
f1(10); // ok, 10是右值

在上面的例子中函数模板进行了自动类型推导,需要通过传入的实参来确定参数param的实际类型。

  • 第4行中,对于f(10)来说传入的实参10是右值,因此T&&表示右值引用

  • 第6行中,对于f(x)来说传入的实参是x是左值,因此T&&表示左值引用

  • 第7行中,f1(x)的参数是const T&&不是未定引用类型,不需要推导,本身就表示一个右值引用


由于上述代码中存在 T&& 或者 auto&& 这种未定引用类型,当它作为参数时,有可能被一个右值引用初始化,也有可能被一个左值引用初始化,在进行类型推导时右值引用类型(&&)会发生变化,这种变化被称为引用折叠。在C++11中引用折叠的规则如下:

  • 通过右值推导 T&& 或者 auto&&得到的是一个右值引用类型
  • 通过非右值(右值引用、左值、左值引用、常量右值引用、常量左值引用)推导 T&& 或者 auto&& 得到的是一个左值引用类型
  • 另外还有一点需要额外注意 const T&& 表示一个右值引用,不是未定引用类型,不需要推导。

例子3:

int&& a1 = 5;
auto&& bb = a1;
auto&& bb1 = 5;int a2 = 5;
int &a3 = a2;
auto&& cc = a3;
auto&& cc1 = a2;const int& s1 = 100;
const int&& s2 = 100;
auto&& dd = s1;
auto&& ee = s2;const auto&& x = 5;		//type(x) = const int && xint && gg = 5;
auto && ii = gg;		// type(ii) =  int & iiint && hh = gg;         // 错误,gg是右值引用,使用上相当于左值,左值不可以初始化右值引用
int && hh = move(gg);	// ok,通过move()函数进行了资源的转移,将左值转换为了右值。
  • 第2行:a1为右值引用,推导出的bb为左值引用类型
  • 第3行:5为右值,推导出的bb1为右值引用类型
  • 第7行:a3为左值引用,推导出的cc为左值引用类型
  • 第8行:a2为左值,推导出的cc1为左值引用类型
  • 第12行:s1为常量左值引用,推导出的dd为常量左值引用类型
  • 第13行:s2为常量右值引用,推导出的ee为常量左值引用类型
  • 第15行:x为右值引用,不需要推导,只能通过右值初始化



参考链接:

爱编程的大丙-右值引用
爱编程的大丙-转移和完美转发

相关文章:

【C++新特性】右值引用

右值和右值的区别 C11 中右值可以分为两种&#xff1a;一个是将亡值&#xff08; xvalue, expiring value&#xff09;&#xff0c;另一个则是纯右值&#xff08; prvalue, PureRvalue&#xff09;&#xff1a; 纯右值&#xff1a;非引用返回的临时变量、运算表达式产生的临时变…...

信息安全基础知识(完整)

信息安全基础知识 安全策略表达模型是一种对安全需求与安全策略的抽象概念表达&#xff0c;一般分为自主访问控制模型&#xff08;HRU&#xff09;和强制访问控制模型&#xff08;BLP、Biba&#xff09;IDS基本原理是通过分析网络行为&#xff08;访问方式、访问量、与历史访问…...

QT

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) ,Gcancle(new QPushButton("取消",this)) ,EmmEdit(new QLineEdit(this)) { ui->setupUi(this);…...

双例集合(三)——双例集合的实现类之TreeMap容器类

Map接口有两个实现类&#xff0c;一个是HashMap容器类&#xff0c;另一个是TreeMap容器类。TreeMap容器类的使用在API上于HashMap容器类没有太大的区别。它们的区别主要体现在两个方面&#xff0c;一个是底层实现方式上&#xff0c;HashMap是基于Hash算法来实现的吗&#xff0c…...

[SAP ABAP] 运算符

1.算数运算符 算术运算符描述加法-减法*乘法/除法MOD取余 示例1 输出结果: 输出结果: 2.比较运算符 比较运算符描述示例 等于 A B A EQ B <> 不等于 A <> B A NE B >大于 A > B A GT B <小于 A < B A LT B >大于或等于 A > B A GE B <小…...

MSPM0G3507 ——GPIO例程讲解2——simultaneous_interrupts

主函数&#xff1a; #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();/* Enable Interrupt for both GPIOA and GPIOB ports */NVIC_EnableIRQ(GPIO_SWITCHES_GPIOA_INT_IRQN); //启用SWITCHES——A的中断 NVIC_EnableIRQ(GPIO_S…...

某程序员:30岁了,老婆管钱,背着我买了50万股票,亏了20w,强制她清仓后又买了36万

“辛辛苦苦攒了几年钱&#xff0c;本想买房买车&#xff0c;结果全被老婆炒股亏掉了&#xff01;” 近日&#xff0c;一位30岁的程序员大哥在网上吐苦水&#xff0c;引发了网友们的热议。 这位程序员大哥和妻子结婚后&#xff0c;一直秉持着“男主外&#xff0c;女主内”的传统…...

Docker常见面试题整理

文章目录 1. Docker 是什么&#xff1f;它解决了什么问题&#xff1f;2. Docker 和虚拟机&#xff08;VM&#xff09;的区别是什么&#xff1f;3、Docker三个核心概念4、如何构建一个 Docker 镜像&#xff1f;5、如何将一个 Docker 容器连接到多个网络&#xff1f;6、Docker Co…...

35 - 最后一个能进入巴士的人(高频 SQL 50 题基础版)

35 - 最后一个能进入巴士的人 -- sum(weight) over(order by turn) as total,根据turn升序&#xff0c;再求前面数的和 selectperson_name from(selectperson_name,sum(weight) over(order by turn) as totalfromQueue) new_Queue wheretotal<1000 order by total desc lim…...

WPF将dll文件嵌入到exe文件中

WPF将dll文件嵌入到exe文件中 第一步&#xff1a;打开.csproj文件&#xff0c;在Import节点后添加如下代码&#xff1a; <Target Name"AfterResolveReferences"><ItemGroup><EmbeddedResource Include"(ReferenceCopyLocalPaths)" Condit…...

2024年AI+游戏赛道的公司和工具归类总结

随着人工智能技术的飞速发展,AI在游戏开发领域的应用越来越广泛。以下是对2024年AI+游戏赛道的公司和工具的归类总结,涵盖了从角色和场景设计到音频制作,再到动作捕捉和动画生成等多个方面。 2D与3D创作 2D创作工具:专注于角色和场景的平面设计,提供AI辅助的图案生成和风…...

svm和决策树基本知识以及模型评价以及模型保存

svm和决策树基本知识以及模型评价以及模型保存 文章目录 一、SVM1.1&#xff0c;常用属性函数 二、决策树2.1&#xff0c;常用属性函数2.2&#xff0c;决策树可视化2.3&#xff0c;决策树解释 3&#xff0c;模型评价3.1&#xff0c;方面一&#xff08;评价指标&#xff09;3.2&…...

C++ 79 之 自己写异常类

#include <iostream> #include <string> using namespace std;class MyOutOfRange : public exception{ // 选中exception右键 转到定义 复制一份 virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW 进行函数重写 public: string m_msg;M…...

如何搭建一个成功的短剧制作平台

要搭建一个成功的短剧制作平台&#xff0c;需要考虑多个方面&#xff0c;包括目标定位、技术选择、内容管理、用户体验等。 1、明确目标和定位&#xff1a; 确定你的目标受众是谁&#xff0c;他们的年龄、兴趣、消费习惯等。 明确短剧制作平台的主要定位&#xff0c;是提供原创…...

kotlin类

一、定义 1、kotlin中使用关键字class 声明类,如果一个类没有类体&#xff0c;也可以省略花括号&#xff0c; 默认为public 类型的&#xff1a; // 这段代码定义了一个公开的、不可被继承的Test类 class Test{} // 没有类体&#xff0c;可以省略花括号 class Test 底层代码&…...

android | studio的UI布局和代码调试 | UI调试 (用于找到项目源码)

网上找到一个项目&#xff0c;想快速的搞懂是怎么实现的&#xff0c;搞了半天发现原来android都升级到Jetpack Compose了&#xff0c;然后去找源码挺不容易的&#xff0c;摸索中发现了这个调试的方法&#xff0c;还可以。 https://developer.android.com/studio/debug/layout-i…...

LangChain实战技巧之六:一起玩转config(上篇)——ConfigurableField

简介 Config 包含两大类内容&#xff0c; ConfigurableField 可配置的字段 configurable_alternatives 可配置的替代方案 分别使用两篇文章来给大家介绍&#xff0c;本篇先介绍ConfigurableField 常规介绍 一些资料会这样介绍 model_spec model.configurable_fields(model…...

扫码称重上位机

目录 一 设计原型 二 后台代码 一 设计原型 模拟工具: 二 后台代码 主程序&#xff1a; using System.IO.Ports; using System.Net; using System.Net.Sockets; using System.Text;namespace 扫码称重上位机 {public partial class Form1 : Form{public Form1(){Initialize…...

操作系统入门 -- 进程的通信方式

操作系统入门 – 进程的通信方式 1.什么是进程通信 1.1 定义 进程通信就是在不同进程之间交换信息。在之前文章中可以了解到&#xff0c;进程之间相互独立&#xff0c;一般不可能互相访问。因此进程之间若需要通信&#xff0c;则需要一个所有进程都认可的共享空间&#xff0…...

Python读取wps中的DISPIMG图片格式

需求&#xff1a; 读出excel的图片内容&#xff0c;这放在微软三件套是很容易的&#xff0c;但是由于wps的固有格式&#xff0c;会出现奇怪的问题&#xff0c;只能读出&#xff1a;类似于 DISPIMG(“ID_2B83F9717AE1XXXX920xxxx644C80DB1”,1) 【该DISPIMG函数只有wps才拥有】 …...

【免费下载】 探索高效CAN通信:PCAN PRO/PRO FD USB2CAN固件实现

探索高效CAN通信&#xff1a;PCAN PRO/PRO FD USB2CAN固件实现 项目介绍 PCAN PRO/PRO FD USB2CAN固件实现是一个专为基于STM32F4的廉价硬件设计的开源项目。该项目旨在为使用STM32F407/405开发板的用户提供一个高效、稳定的USB2CAN通信解决方案。通过该固件&#xff0c;用户可…...

ESP32一键安装CircuitPython与Wi-Fi配置:Web串口技术实战指南

1. 项目概述&#xff1a;告别繁琐&#xff0c;一键搞定ESP32固件与网络配置如果你玩过ESP32、ESP32-S3这类微控制器&#xff0c;肯定对固件烧录这个步骤不陌生。传统的流程是什么&#xff1f;先去官网下载对应板型的.bin或.uf2文件&#xff0c;然后打开一个专用的烧录工具&…...

英雄联盟个性化改造神器:3分钟打造专属游戏身份

英雄联盟个性化改造神器&#xff1a;3分钟打造专属游戏身份 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为千篇一律的英雄联盟个人资料感到乏味吗&#xff1f;想要在好友面前展示与众不同的游戏身份却苦于官方限制&…...

四大路径!CS保研生冲刺南京大学如何精准定位?

1. 南京大学计算机保研全景地图 对于计算机专业的保研生来说&#xff0c;南京大学就像一座蕴藏着丰富矿藏的山脉&#xff0c;不同院系代表着不同的矿脉。作为国内顶尖高校&#xff0c;南大计算机相关学科分布在四个主要院系&#xff1a;计算机科学与技术系&#xff08;传统强系…...

别再只调API了!深入XXL-Job时间轮源码,手把手带你搞懂任务触发与调度过期的那些坑

深入XXL-Job时间轮&#xff1a;从源码解析任务调度与过期处理的实战指南 在分布式任务调度领域&#xff0c;XXL-Job以其轻量级、易扩展的特性成为众多Java项目的首选方案。但当我们从简单的API调用者转变为架构设计者时&#xff0c;仅满足于配置层面的理解显然不够。本文将带您…...

告别Keil幻想!为什么MSP430F5529开发我最终选择了CCS(附完整driverlib库配置流程)

从Keil到CCS&#xff1a;MSP430F5529开发工具链的理性抉择与技术实践 第一次接触MSP430F5529时&#xff0c;我下意识地打开了熟悉的Keil MDK。毕竟在STM32的世界里&#xff0c;Keil几乎是我的第二开发环境。但当我尝试导入TI官方例程时&#xff0c;一连串的报错让我意识到——这…...

【亲测免费】 电机速度闭环控制(代码详细注释)

电机速度闭环控制&#xff08;代码详细注释&#xff09; 【下载地址】电机速度闭环控制代码详细注释 本仓库提供了电机速度闭环控制的实践教程&#xff0c;特别适合对电机控制、尤其是PID控制算法感兴趣的学习者。PID控制是一种广泛应用于工程领域的闭环控制策略&#xff0c;能…...

超导量子处理器校准技术:频率分配与门优化

1. 超导量子处理器校准技术概述超导量子处理器校准是量子计算硬件实现中的关键环节&#xff0c;其核心目标是通过系统化的参数优化和误差抑制&#xff0c;确保量子比特能够可靠地执行高保真度的量子门操作。在Zuchongzhi 3.1处理器的研发过程中&#xff0c;我们成功集成了105个…...

Haneke最佳实践:10个技巧让你的图片缓存更高效

Haneke最佳实践&#xff1a;10个技巧让你的图片缓存更高效 【免费下载链接】Haneke A lightweight zero-config image cache for iOS, in Objective-C. 项目地址: https://gitcode.com/gh_mirrors/ha/Haneke Haneke是一款适用于iOS平台的轻量级零配置图片缓存库&#xf…...

【ElevenLabs企业级克隆部署白皮书】:单模型支持12种语境情绪、延迟<480ms、通过GDPR+CCPA双认证

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs企业级语音克隆技术全景概览 ElevenLabs 企业级语音克隆技术以高保真度、低延迟和强可控性为核心&#xff0c;面向金融客服、跨国培训、无障碍内容生成等关键业务场景提供端到端语音合成解决…...