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

【C++11】新特性 - 右值引用详解

文章目录

    • STD容器使用右值引用场景
      • 移动语义在容器中的使用主要体现在两个方面:移动构造函数和移动赋值运算符。
        • 移动语义只对右值有效,对左值无效原因

STD容器使用右值引用场景

移动语义在容器中的使用主要体现在两个方面:移动构造函数和移动赋值运算符。

  1. 移动构造函数:容器在插入元素时,通常需要进行内存分配和对象构造操作。如果元素类型具有移动构造函数,容器就可以使用移动构造函数来构造元素,避免不必要的拷贝和销毁操作,提高程序的性能和效率。

例如,下面的代码中,使用了移动构造函数来构造 std::vector 容器中的元素:

#include <iostream>
#include <vector>
#include <string>int main() {std::vector<std::string> v;std::string s = "hello";v.push_back(std::move(s)); // 使用移动构造函数构造元素std::cout << s << std::endl; // 输出空字符串return 0;
}

在这个示例中,我们定义了一个 std::vector 容器和一个字符串对象 s,并使用 push_back 函数将 s 移动到容器中。由于使用了移动构造函数,s 的资源所有权被转移到容器中,s 变成了一个空字符串。

  1. 移动赋值运算符:容器在进行元素赋值时,通常需要进行对象销毁和对象构造操作。如果元素类型具有移动赋值运算符,容器就可以使用移动赋值运算符来赋值元素,避免不必要的拷贝和销毁操作,提高程序的性能和效率。

例如,下面的代码中,使用了移动赋值运算符来赋值 std::vector 容器中的元素:

#include <iostream>
#include <vector>
#include <string>int main() {std::vector<std::string> v;std::string s1 = "hello";std::string s2 = "world";v.push_back(s1);v[0] = std::move(s2); // 使用移动赋值运算符赋值元素std::cout << s2 << std::endl; // 输出空字符串return 0;
}

在这个示例中,我们定义了一个 std::vector 容器和两个字符串对象 s1s2,并使用 push_back 函数将 s1 插入到容器中。然后,我们使用移动赋值运算符将 s2 赋值给容器中的元素。由于使用了移动赋值运算符,s2 的资源所有权被转移到容器中,s2 变成了一个空字符串。

需要注意的是,移动语义只对右值有效,对左值无效。因此,在使用移动语义时,需要注意对象的值类别。

移动语义只对右值有效,对左值无效原因

移动语义的本质是将一个对象的资源所有权从一个对象转移到另一个对象,避免不必要的复制和销毁操作,提高程序的性能和效率。对于右值对象,由于其不再被使用,因此可以将其资源所有权转移到另一个对象,避免了不必要的拷贝和销毁操作。

而对于左值对象,由于其可能还会被使用,因此不能将其资源所有权转移到另一个对象,否则会导致程序出错。例如,如果将一个左值对象的资源所有权转移到另一个对象,那么原对象就不能再被使用,这可能会导致程序出现未定义行为。

实例:
当一个对象是左值时,它通常是一个具有名称的变量或对象,它在程序中可能还会被使用。例如:

std::string s1 = "hello";
std::string s2 = s1; // 拷贝构造函数,将 s1 的值拷贝给 s2

在这个示例中,s1 是一个左值对象,它是一个具有名称的字符串变量。当我们将 s1 的值赋给 s2 时,会调用拷贝构造函数,将 s1 的值拷贝给 s2,这是因为 s1 是一个左值对象,不能将其资源所有权转移到另一个对象。 若转移了所有权,

而当一个对象是右值时,它通常是一个临时对象或表达式的结果,它在程序中不再被使用。例如:

std::string s1 = "hello";
std::string s2 = std::move(s1);  // 移动构造函数,将 s1 的值转移到 s2

在这个示例中,s1 是一个右值对象,它是一个临时对象或表达式的结果。当我们将 s1 的值转移到 s2 时,会调用移动构造函数,将 s1 的值转移到 s2,这是因为 s1 是一个右值对象,可以将其资源所有权转移到另一个对象。由于 s1 不再被使用,因此可以将其资源所有权转移到 s2,避免了不必要的拷贝和销毁操作。

因此,移动语义只对右值对象有效,对左值对象无效。在使用移动语义时,需要注意对象的值类别,避免出现不必要的错误和问题。

相关文章:

【C++11】新特性 - 右值引用详解

文章目录STD容器使用右值引用场景移动语义在容器中的使用主要体现在两个方面&#xff1a;移动构造函数和移动赋值运算符。移动语义只对右值有效&#xff0c;对左值无效原因STD容器使用右值引用场景 移动语义在容器中的使用主要体现在两个方面&#xff1a;移动构造函数和移动赋…...

C++学习笔记

C学习笔记函数一般有返回值&#xff0c;构造函数有没有返回值&#xff1f;有返回值&#xff0c;返回一个对象&#xff0c;确定所以没写&#xff1b;在头文件中&#xff0c;防卫式声明&#xff0c;#ifndef…#define … #endif;pass by value或者 reference&#xff0c;传值是整包…...

项目1实现login登录功能方案设计第三版

需求优化点:MySQL表常用功能模块实现方案index页面home页面需求 实现一个登录功能 实现的功能 注册(邮箱注册)登录(邮箱密码)重置密码查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)登出在第2版的基础上进行优化:\ 优化点: VerificationCode(验证码储存库): 增加时间字段…...

Node【七】初识Express框架

文章目录&#x1f31f;前言&#x1f31f;Express框架&#x1f31f;1.什么是框架&#x1f31f;2.express安装&#x1f31f;3.创建web服务基本遵循之前的四个步骤&#xff1a;&#x1f31f;4.路由&#x1f31f; 由 &#xff1a;请求方式请求路径&#xff08;1&#xff09;get发送…...

Android 高通Camera2 Camera Device Close

1、很多人看到这个日志第一感觉可能觉得哪里没有合理释放&#xff0c;于是带着这个思路去进行百度探索 2、一开始我去寻找 ImageReader.OnImageAvailableListener 这个问题 var afterBitmap: Bitmap? null/**监听拍照的图片 */private val imageAvailableListener ImageRead…...

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5

原文&#xff1a;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的…...

4、浅谈Makefile文件及其简单的使用知识

文章目录1、什么是Makefile&#xff1f;&#xff08;1&#xff09;makefile关系到了整个工程的编译规则。&#xff08;2&#xff09;makefile带来的好处就是——“自动化编译”&#xff08;3&#xff09;make是一个命令工具&#xff0c;是一个解释makefile中指令的命令工具2、为…...

5G/V2X赛道「重启」

在提升高阶智能驾驶安全性和感知冗余能力的道路上&#xff0c;除了激光雷达、高精度地图及定位&#xff0c;还有一项技术可能即将掀起一场新的风暴。 就在今年3月&#xff0c;作为全球通信领域的年度风向标 — 2023世界移动通信大会&#xff08;MWC&#xff09;上&#xff0c;…...

pytorch进阶学习(四):使用不同分类模型进行数据训练(alexnet、resnet、vgg等)

课程资源&#xff1a;5、帮各位写好了十多个分类模型&#xff0c;直接运行即可【小学生都会的Pytorch】_哔哩哔哩_bilibili 目录 一、项目介绍 1. 数据集准备 2. 运行CreateDataset.py 3. 运行TrainModal.py 4. 如何切换显卡型号 二、代码 1. CreateDataset.py 2.Train…...

Java面向对象高级【注解和反射】

目录 注解 什么是注解&#xff1f; 自定义注解 元注解 反射 什么是反射 静态语言和动态语言 动态语言 静态语言 对比 Class类 Java内存分析 类加载过程 类加载器 获取运行时类的完整结构 通过Class对象实例化对象 1.调用Class对象的newInstance 2.Constructor…...

Pytorch基础 - 4. torch.expand() 和 torch.repeat()

目录 1. torch.expand(*sizes) 2. torch.repeat(*sizes) 3. 两者内存占用的区别 在PyTorch中有两个函数可以用来扩展某一维度的张量&#xff0c;即 torch.expand() 和 torch.repeat() 1. torch.expand(*sizes) 【含义】将输入张量在大小为1的维度上进行拓展&#xff0c;…...

《LeetCode》——LeetCode刷题日记

本期&#xff0c;将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。 目录 &#xff08;一&#xff09;606. 根据二叉树创建字符串 &#x1f4a5;题意分析 &#x1f4a5;解题思路 &#xff08;二&#xff09;102. 二叉树的层序遍历 &#x1f4a5;题意分析 &#…...

mysql数据库审计(1)

1.数据库审计工具介绍及选择 1.1. 数据库审计工具介绍 MySQL 分支的审计功能包含在企业版中&#xff0c;社区版可以使用其他分支提供的工具。目前已知的审计工具&#xff0c;社区版本有 Percona 的 Percona Server Audit Log 、MariaDB 的 MariaDB Audit Plugin 和 McAfee 的…...

Kafka---kafka概述和kafka基础架构

kafka概述和kafka基础架构 文章目录kafka概述和kafka基础架构Kafka定义消息队列传统消息队列应用场景缓存/消峰解耦异步通信消息队列的两种模式点对点模式发布/订阅模式kafka基础架构producerConsumerConsumer Group&#xff08;CG&#xff09;BrokerTopicPartitionReplicaLead…...

《JavaEE初阶》多线程基础

《JavaEE初阶》多线程基础 文章目录《JavaEE初阶》多线程基础前言:多线程的概念简单创建线程并运行:简述Thread中run方法与start方法的区别创建线程的几种方法:探讨串行执行与并行执行的执行时间多线程的使用场景:Thread类简单介绍:构造方法:获取线程的常见属性:线程的常用方法…...

技术分享 | OMS 初识

作者&#xff1a;高鹏 DBA&#xff0c;负责项目日常问题排查&#xff0c;广告位长期出租 。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文主要贡献者&#xff1a;进行OMS源码分析的…...

【Elastic (ELK) Stack 实战教程】10、ELK 架构升级-引入消息队列 Redis、Kafka

目录 一、ELK 架构面临的问题 1.1 耦合度过高 1.2 性能瓶颈 二、ELK 对接 Redis 实践 2.1 配置 Redis 2.1.1 安装 Redis 2.1.2 配置 Redis 2.1.3 启动 Redis 2.2 配置 Filebeat 2.3 配置 Logstash 2.4 数据消费 2.5 配置 kibana 三、消息队列基本概述 3.1 什么是…...

优先、双端队列-我的基础算法刷题之路(八)

本篇博客旨在整理记录自已对优先队列、双端队列的一些总结&#xff0c;以及刷题的解题思路&#xff0c;同时希望可给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉 &…...

Python3 os.symlink() 方法、Python 质数判断

Python3 os.symlink() 方法 概述 os.symlink() 方法用于创建一个软链接。 语法 symlink()方法语法格式如下&#xff1a; os.symlink(src, dst)参数 src -- 源地址。 dst -- 目标地址。 返回值 该方法没有返回值。 实例 以下实例演示了 symlink() 方法的使用&#xff1…...

P1972 [SDOI2009] HH的项链

[SDOI2009] HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运&#xff0c;所以每次散步完后&#xff0c;他都会随意取出一段贝壳&#xff0c;思考它们所表达的含义。HH 不断地收集新的贝壳&#xff0c;因此&#xff0c;他的项链变得越来…...

AI Agent Harness Engineering 后端架构选型:微服务 vs 单体架构的取舍

AI Agent Harness Engineering 后端架构选型深度指南:微服务 vs 单体架构的取舍、落地与最佳实践 摘要/引言 你有没有过这样的经历:团队好不容易赶完了AI Agent的POC验证,正准备规模化落地,却卡在了后端架构选型上? 有人说“微服务是未来”,上来就拆了8个服务,结果3个后…...

三步完成微信好友关系一键检测:发现谁偷偷删除了你

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

破解人类微生物组数据分析难题:curatedMetagenomicData的完整解决方案

破解人类微生物组数据分析难题&#xff1a;curatedMetagenomicData的完整解决方案 【免费下载链接】curatedMetagenomicData Curated Metagenomic Data of the Human Microbiome 项目地址: https://gitcode.com/gh_mirrors/cu/curatedMetagenomicData 宏基因组数据分析在…...

SpringBoot+Vue学生竞赛管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

Purple Pi OH开发板适配OpenHarmony 5.0全流程解析与实战

1. 项目概述&#xff1a;从一块开发板到OpenHarmony 5.0的完整旅程最近&#xff0c;我手头的这块触觉智能Purple Pi OH开发板&#xff0c;终于成功跑通了OpenHarmony 5.0 Release版本。这不仅仅是一次简单的系统升级适配&#xff0c;更像是一场从硬件引脚定义、内核驱动、系统服…...

从CRUD到高薪:收藏这份程序员升级大模型学习指南,抓住AI时代红利!

作者分享个人从普通程序员通过学习AI大模型实现薪资翻倍的经历。文章指出&#xff0c;AI时代程序员最危险的不是被AI取代&#xff0c;而是重复低水平代码工作而不自知。作者从ChatGPT出现后的警醒&#xff0c;到深入学习大模型应用与算法&#xff0c;最终实现职业突破。强调普通…...

告别手写轮播!用vue-j-scroll插件5分钟搞定Vue列表无缝滚动(含鼠标悬停控制)

5分钟极速集成&#xff1a;用vue-j-scroll实现Vue列表智能滚动方案 在数据密集型的现代Web应用中&#xff0c;动态列表展示几乎成为标配需求。无论是后台管理系统的操作日志、金融平台的实时交易流水&#xff0c;还是新闻客户端的资讯推送&#xff0c;流畅的自动滚动效果不仅能…...

Windows HEIC缩略图终极解决方案:3步解锁苹果照片完美预览

Windows HEIC缩略图终极解决方案&#xff1a;3步解锁苹果照片完美预览 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 还在为iPh…...

枚举进阶:从常量集合到业务逻辑承载者的实战扩展技巧

1. 项目概述&#xff1a;从“能用”到“好用”的枚举进阶之路在软件开发中&#xff0c;枚举&#xff08;Enum&#xff09;是我们再熟悉不过的基础工具了。它把一组有限的、具名的常量组织在一起&#xff0c;让代码意图更清晰&#xff0c;避免“魔法数字”满天飞。但不知道你有没…...

C++11多线程与线程管理

一、线程基础 1.1 thread默认构造函数 std::thread::thread() _NOEXCEPT {_Thr_set_null(_Thr); }默认构造函数创建一个空线程对象&#xff0c;不关联任何执行线程。 1.2 thread带参数构造函数 explicit thread(Fn &&, Args &&...);可变参数模板&#xff0c;可…...