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

C++11 右值引用

目录

左值

右值

左值引用与右值引用比较

左值引用总结:

右值引用总结:

左值引用的使用场景:

引用传参和做返回值都可以提高效率(减少拷贝)

左值引用的短板:

右值引用和移动语义解决上述问题:

下面就是有移动构造的情况

不仅仅有移动构造,还有移动赋值:

STL中的容器都是增加了移动构造和移动赋值

右值引用的使用问题:​编辑


左值

        左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。

定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址

int main()
{// 以下的p、b、c、*p都是左值int* p = new int(0);int b = 1;const int c = 2;// 以下几个是对上面左值的左值引用int*& rp = p;int& rb = b;const int& rc = c;int& pvalue = *p;return 0;
}

右值

        右值也是一个表示数据的表达式,不能取地址 如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。

int main()
{double x = 1.1, y = 2.2;// 以下几个都是常见的右值10;x + y;fmin(x, y);// 以下几个都是对右值的右值引用int&& rr1 = 10;double&& rr2 = x + y;double&& rr3 = fmin(x, y);// 这里编译会报错:error C2106: “=”: 左操作数必须为左值10 = 1;x + y = 1;fmin(x, y) = 1;return 0;
}

左值引用就是给左值的引用,给左值取别名

右值引用就是对右值的引用,给右值取别名

左值引用与右值引用比较

左值引用总结:

        1. 左值引用只能引用左值,不能引用右值。

        2. 但是const左值引用既可引用左值,也可引用右值 (匿名对象传参)

int main()
{// 左值引用只能引用左值,不能引用右值。int a = 10;int& ra1 = a;   // ra为a的别名//int& ra2 = 10;   // 编译失败,因为10是右值// const左值引用既可引用左值,也可引用右值。const int& ra3 = 10;const int& ra4 = a;return 0;
}

右值引用总结:

        1. 右值引用只能右值,不能引用左值。

        2. 但是右值引用可以move以后的左值。

        move(左值1)是右值 , move()相当于类型转换.

        左值1还是左值

int main()
{// 右值引用只能右值,不能引用左值。int&& r1 = 10;// error C2440: “初始化”: 无法从“int”转换为“int &&”// message : 无法将左值绑定到右值引用int a = 10;int&& r2 = a;// 右值引用可以引用move以后的左值int&& r3 = std::move(a);return 0;
}

左值引用的使用场景:

引用传参和做返回值都可以提高效率(减少拷贝)

void func1(bit::string s)
{}
void func2(const bit::string& s)
{}
int main()
{bit::string s1("hello world");// func1和func2的调用我们可以看到左值引用做参数减少了拷贝,提高效率的使用场景和价值func1(s1);func2(s1);// string operator+=(char ch) 传值返回存在深拷贝// string& operator+=(char ch) 传左值引用没有拷贝提高了效率s1 += '!';return 0;
}

左值引用的短板:

        但是当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回, 只能传值返回。

        但是传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造,新的编译器会进行优化)。

编译器优化情况

右值引用和移动语义解决上述问题:

        在string中增加移动构造(参数是右值),移动构造本质是将参数右值的资源窃取过来(右值(将亡值)不会被释放),会被占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是利用别人的资源来构造自己

解决了这种问题

如果同时有拷贝构造(const string& s)和移动构造(string&& s)

        传左值时会用拷贝构造

        传右值时会用移动构造

下面就是有移动构造的情况

// 移动构造
string(string&& s):_str(nullptr),_size(0),_capacity(0)
{cout << "string(string&& s) -- 移动语义" << endl;swap(s);
}int main()
{bit::string ret2 = bit::to_string(-1234);return 0;
}

不仅仅有移动构造,还有移动赋值

        在string类中增加移动赋值函数,再去调用to_string(1234),不过这次是将 to_string(1234)返回的对象赋值给s1对象,这时调用的是移动赋值。

// 移动赋值
string& operator=(string&& s)
{cout << "string& operator=(string&& s) -- 移动语义" << endl;swap(s);return *this;
}

写了移动赋值后,这里运行后,我们看到调用了两次构造和一次移动赋值。

        第一次构造是构造s1,第二次是构造str, 移动赋值是将str利用.

STL中的容器都是增加了移动构造和移动赋值

所以使用容器时尽可能传输匿名对象可以提高效率.

右值引用的使用问题:

在使用时应该注意左右值的转化

在接受一次后会使,右值变成左值

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

相关文章:

C++11 右值引用

目录 左值 右值 左值引用与右值引用比较 左值引用总结&#xff1a; 右值引用总结&#xff1a; 左值引用的使用场景&#xff1a; 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板&#xff1a; 右值引用和移动语义解决上述问题&#xff1a; 下面就是有移动…...

WPS表格学习计划与策略

一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...

Android 引入 proto 项目及使用方法

Proto&#xff08;Protocol Buffers&#xff09;是Google开发的一种语言无关、平台无关的序列化结构数据的方法&#xff0c;它类似于JSON和XML&#xff0c;但相对于XML而言更小&#xff0c;相对于JSON而言解析更快&#xff0c;支持多语言。以下是将Proto引入Android项目的方法及…...

VSOMEIP主要流程的时序

请求服务: client应用&#xff1a; ​ application_impl::request_service ​ routing_manager_client::request_service (老版本是routing_manager_proxy) ​ routing_manager_client::send_request_services ​ protocol::request_service_command its_command; // 创建…...

右值引用和移动语义:

C 右值引用和移动语义详解 在 C 的发展历程中&#xff0c;右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言&#xff0c;一直在不断演进以满足现代软件编程的需求。…...

经纬高LLA转地心地固ECEF坐标,公式,代码

经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高&#xff0c;经纬高在slam系统里无法应用&#xff0c;slam系统一般是xyz互相垂直的笛卡尔坐标系&#xff0c;所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...

VUE前端实现天爱滑块验证码--详细教程

第一步&#xff1a; Git地址&#xff1a;tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步&#xff1a; 将改为 tac 的文件&#xff0c;放进项目根目录中&#xff0c;如下图&#xff1a; 第三步&#xff1…...

【链表】【删除节点】【刷题笔记】【灵神题单】

237.删除链表的节点 链表删除节点的本质是不用删除&#xff0c;只需要操作指针&#xff0c;跳过需要删除的节点&#xff0c;指向下下一个节点即可&#xff01; 删除某个节点&#xff0c;但是不知道这个节点的前一个节点&#xff0c;也不知道头节点&#xff01;摘自力扣评论区…...

springboot339javaweb的新能源充电系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…...

【嵌入式——QT】QT制作安装包

第一步 QT程序写好之后&#xff0c;编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令&#xff0c;回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...

python的文件操作练习

文件操作&#xff1a;成绩统计 有一个文件grades.txt&#xff0c;文件内容是每行一个学生的成绩&#xff08;格式&#xff1a;姓名,成绩&#xff09;。要求&#xff1a; 读取文件内容&#xff0c;统计所有学生的平均成绩&#xff1b; 将不及格&#xff08;<60分&#xff09…...

jQuery九宫格抽奖,php处理抽奖信息

功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项&#xff0c;用户点击抽奖按钮后&#xff0c;九宫格开始旋转&#xff0c;最终停在一个随机位置上&#xff0c;此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为&#xf…...

2024年一级建造师考试成绩,即将公布!

一级建造师考试成绩一般在考试结束后3个月左右的时间公布&#xff01; 根据官方通知&#xff0c;重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到&#xff1a;2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...

M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?

M4V 是一种视频文件格式&#xff0c;主要由苹果公司用于其产品和服务中&#xff0c;如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容&#xff0c;并且通常与苹果的 DRM&#xff08;数字版权管理&#xff09;技术结合使用&#xff0c;以限制内容的复制和…...

Leetcode 每日一题 104.二叉树的最大深度

目录 问题描述 示例 示例 1&#xff1a; 示例 2&#xff1a; 约束条件 题解 方法一&#xff1a;广度优先搜索&#xff08;BFS&#xff09; 步骤 代码实现 方法二&#xff1a;递归 步骤 代码实现 结论 问题描述 给定一个二叉树 root&#xff0c;我们需要返回其最大…...

文件上传漏洞:你的网站安全吗?

文章目录 文件上传漏洞攻击方式&#xff1a;0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...

AWS账号提额

Lightsail提额 控制台右上角&#xff0c;用户名点开&#xff0c;选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...

电子应用设计方案-29:智能云炒菜系统方案设计

智能云炒菜系统方案设计 一、系统概述 本智能云炒菜系统旨在为用户提供便捷、高效、个性化的烹饪体验&#xff0c;结合云技术实现远程控制、食谱分享、智能烹饪流程优化等功能。 二、系统组成 1. 炒菜锅主体 - 高品质不粘锅内胆&#xff0c;易于清洁和维护。 - 加热装置&#x…...

腾讯rapidJson使用例子

只需要把库的头文件拿下来加入项目中使用就行&#xff0c;我是以二进制文件存储内容并解析&#xff1a; #include <iostream> #include <fstream> #include <string> #include "rapidjson/document.h" #include "rapidjson/error/en.h"…...

UE5_CommonUI简单使用(2)

上篇我是简单写了一下CommonUI使用的初始设置以及Common Activatable Widget和Common Activatable Widget Stack以及Common 控件Style以及鼠标控制的一些内容,这些对于了解UMG的朋友来说没什么难度,唯一需要注意的就是Common Activatable Widget Stack堆栈管理只能是用来管理…...

百度网盘直链解析终极指南:三步实现免客户端高速下载

百度网盘直链解析终极指南&#xff1a;三步实现免客户端高速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘限速而烦恼吗&#xff1f;今天我要向你介绍一款…...

2026年如何集成Hermes Agent/OpenClaw?阿里云部署及token Plan配置步骤

2026年如何集成Hermes Agent/OpenClaw&#xff1f;阿里云部署及token Plan配置步骤。 OpenClaw和Hermes Agent是什么&#xff1f;OpenClaw和Hermes Agent怎么部署&#xff1f;如何部署OpenClaw/Hermes Agent&#xff1f;2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑吗…...

开源项目协作流程标准化:小步协作体系构建与工程实践

1. 项目概述与核心价值最近在和一些做开源项目的朋友聊天&#xff0c;大家普遍提到一个痛点&#xff1a;项目早期&#xff0c;核心贡献者就那么一两个人&#xff0c;代码提交、文档更新、Issue处理&#xff0c;所有事情都堆在一起。想拉新人进来一起搞&#xff0c;但光是搭建开…...

微信好友关系检测神器:5分钟识别谁偷偷删除了你

微信好友关系检测神器&#xff1a;5分钟识别谁偷偷删除了你 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 你是…...

成本感知贝叶斯优化在交互设备原型设计中的应用

1. 成本感知贝叶斯优化在交互设备原型设计中的核心价值在交互设备开发领域&#xff0c;原型迭代是设计过程中最烧钱的环节之一。我曾参与过一个游戏手柄的改进项目&#xff0c;团队在三个月内制作了27个物理原型&#xff0c;每个原型的平均成本高达800美元——这还不包括工程师…...

避坑指南:用VS2022编译libuvc控制USB摄像头时,驱动替换和依赖库的那些坑

VS2022编译libuvc控制USB摄像头的五大避坑实战 最近在Windows平台上用Visual Studio 2022编译libuvc库控制USB摄像头时&#xff0c;发现网上大多数教程都只给出了理想情况下的步骤&#xff0c;而实际开发中会遇到各种"坑"。本文将分享我在这个过程中遇到的五个典型问…...

TensorFlow/Keras自定义模型踩坑记:为什么你的__init__()总报‘serialized_options‘错误?

TensorFlow/Keras自定义模型避坑指南&#xff1a;破解__init__()中的serialized_options之谜 在深度学习项目中使用TensorFlow/Keras框架时&#xff0c;自定义模型是每个开发者必经的进阶之路。但当你满怀信心地继承tf.keras.Model&#xff0c;准备大展身手时&#xff0c;却可能…...

光子内存计算技术:原理、挑战与工程实践

1. 光子内存计算的技术演进与挑战在半导体工艺逼近物理极限的今天&#xff0c;传统CMOS技术面临着互联电阻增加和电容耦合效应加剧的严峻挑战。我曾参与过多个高性能计算芯片的设计项目&#xff0c;亲眼见证了晶体管尺寸微缩带来的边际效益递减现象——当工艺节点进入7nm以下时…...

线阵工业相机:线阵图像出现“波浪纹”,是机械振动还是编码器问题?

线阵工业相机&#xff1a;线阵图像出现“波浪纹”&#xff0c;是机械振动还是编码器问题&#xff1f; 在高速工业视觉检测产线上&#xff0c;线阵相机凭借其超高分辨率和连续成像能力&#xff0c;成为了印刷、薄膜、金属箔材等行业的“质检担当”。然而&#xff0c;很多工程师…...

Apple Foundation Models 框架实战:从设备端 AI 到 RAG 应用开发

1. 项目概述&#xff1a;一个全面的 Apple Foundation Models 框架实战示例如果你是一名 iOS 或 macOS 开发者&#xff0c;最近肯定被 Apple Intelligence 和 Foundation Models 框架刷屏了。但官方文档往往点到为止&#xff0c;真正想上手时&#xff0c;面对一堆新 API 和概念…...