C++11:右值引用,实现移动语义和完美转发

目录

1、右值引用

2、移动语义(std::move)

3、完美转发(std::forward)


1、右值引用

右值引用(Rvalue reference)是C++11引入的一个新特性,它是一种新的引用类型,用于表示将要被移动的对象或临时对象。

(1)首先了解几个关键名词:

(1)左值:可以取地址的表达式,并且有名字;

(2)右值:不能取地址的表达式,且没有名字;

(3)纯右值:运算表达式产生的临时变量,不和对象关联的原始字面量、非引用返回的临时变量、lambda表达式都是纯右值;

(4)将忘值:即将销毁的值;

(5)左值引用&:对左值进行引用的类型,等号右边的值必须可以取地址

(6)右值引用&&:对右值进行引用的类型,等号右边的值需要是右值,可以使用std::move函数强制把左值转换为右值。

(2)相关的代码展示:

int a = 1;  // a是左值
int b = a;  // a是左值,b是左值
int c = a + b;  // a和b是右值,c是左值
int&& rvalue_ref = 1;  // rvalue_ref是右值引用int &&d = a; // error, a是左值
int &&e = std::move(a); // ok

2、移动语义(std::move)

(1)移动语义含义:转移资源所有权,类似转让或者资源窃取,对于那块资源,转为自己所拥有,别人不再拥有也不会再使用;理解深浅拷贝,直接把原来需要拷贝的内存易主

在C++11之前,我们拥有4个特殊成员函数,即构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。从C++11开始,我们多了2个特殊成员函数,即移动构造函数和移动赋值运算符。

在C++11之后,如果我们定义一个空类,除了之前的4个特殊成员函数,编译器还会为我们生成移动构造函数和移动赋值运算符: 

但是我们自定义一些函数时候,可能就不一定会自动生成移动构造函数和移动赋值运算符,相关的关系看下面的表:

(2)右值引用的主要作用是实现移动语义(Move Semantics),即在对象的拷贝或赋值操作中,将资源的所有权从一个对象转移到另一个对象,避免不必要的拷贝和内存分配。例如:

// 例子1
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = std::move(vec1);  // 使用右值引用实现移动// 例子2
std::vector<string> vecs;
...
std::vector<string> vecm = std::move(vecs); // 免//类的
int main() 
{A a(10);A b = a;A c = std::move(a); // 调用移动构造函数return 0;
}

例子1:在上面的代码中,使用std::move将vec1转换为右值引用,然后将其赋值给vec2。由于vec1已经成为右值,因此可以安全地将其资源(即动态分配的内存)转移给vec2,避免了不必要的拷贝和内存分配。

注意:移动语义仅针对于那些实现了移动构造函数的类的对象,对于那种基本类型int、float等没有任何优化作用,还是会拷贝,因为它们实现没有对应的移动构造函数。

还需要关注的重点在于我们需要把传入对象A的数据清除,不然就会产生多个对象共享同一份数据的问题。被转移数据的对象会处于"有效但未定义(valid but unspecified)"的状态。原本的指针要置空。

3、完美转发(std::forward)

(1)右值引用还可以用于实现完美转发(Perfect Forwarding),即在函数模板中将参数按原样转发给另一个函数。即是:转发函数实参是左值,那目标函数实参也是左值;(右值同理)

(2)使用 std::forward 的示例:

#include <iostream>
#include <utility>template<typename T>
void print(T&& arg) {std::cout << "Printing: " << std::forward<T>(arg) << std::endl;
}int main() {int a = 5;const int b = 10;print(a); // T is int&, arg is int&print(b); // T is const int&, arg is const int&print(15); // T is int, arg is int&&return 0;
}

在这个示例中,我们定义了一个名为 print 的模板函数,接受一个类型为 T 的参数 arg。在函数体内,我们通过 std::forward 将 arg 转发给 std::cout,保留其原始值类型和常量性质。

在 main 函数中,我们分别调用 print 函数,传递了一个 int 类型的变量 a,一个 const int 类型的变量 b,以及一个 int 字面量 15。当我们传递 a 和 b 时,T 的类型分别为 int& 和 const int&,因此 arg 的类型也分别为 int& 和 const int&。当我们传递 15 时,T 的类型为 int,arg 的类型为 int&&。

在每个调用中,我们使用 std::forward 将 arg 转发给 std::cout,以便正确地保留其原始类型和常量性质。例如,当 T 为 int& 时,std::forward<T>(arg) 将返回 arg 的左值引用,而当 T 为 int&& 时,std::forward<T>(arg) 将返回 arg 的右值引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/351073.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Neural Network学习笔记3

损失函数和反向传播网络 在进行损失函数计算后&#xff0c;再进行.backward()反向传播。 import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader from torch…

迅雷远程与服务器失去响应,#原创新人# 彻底解决迅雷关闭接口对群晖NAS的影响...

#原创新人# 彻底解决迅雷关闭接口对群晖NAS的影响 2017-07-29 12:00:07 92点赞 668收藏 186评论 从7月17号开始,陆陆续续有小伙伴在各种论坛开始抱怨迅雷的远程下载被封停了,而时不时抽风说CAPTCHA验证码出问题的离线下载的体验也是相当不好,对相当一部分的NAS用户来说影响还…

Python3迅雷vip账号批量抓取导入excel中

1.抓取思路 打开迅雷粉列表页&#xff0c;找到最新账号 为了保证时效&#xff0c;选择第一个列表页进行抓取 利用正则表达式将账号密码提取 账号&#xff1a;([A-Za-z0-9]{6,}) 密码&#xff1a;([A-Za-z0-9]{6,}) 将筛选出的数据利用openpyxl导入到excel中 本次教程结束&am…

写个小爬虫爬下迅雷会员

好久不写爬虫。。。忘了个锤子。于是借着学java的机会用java写个爬虫 爬取静态页面 迅雷会员账号和密码。时时获取最新的~ 先上我暑假写的python版~ &#xff1a; # -*- coding: utf-8 -*- import urllib import re import os url1 http://xlfans.com/ regex r迅雷会员(.…

LNMP服务

目录 一、安装Nginx服务 1.编译安装nginx服务 2.添加nginx系统服务 二、安装Mysql服务 1.编译安装mysql服务 2.修改mysql配置文件 3.设置路径环境变量 4.初始化数据库 5.添加mysql系统服务 6.修改mysql 的登录密码 三、安装配置 PHP 解析环境 1.安装环境依赖包 2.编…

深圳市有什么靠谱的PMP机构推荐吗?

PMP项目管理专业人士资格认证是由美国项目管理协会&#xff08;Project Management Institute&#xff0c;简称PMI&#xff09;发起的。PMP作为世界级的项目管理认证证书&#xff0c;拥有着最先进的项目管理知识体系&#xff0c;它严格评估项目管理人员知识技能是否具有高品质的…

HarmonyOS3 Stage模型介绍

Stage模型是HarmonyOS 3.1 Develper Preview&#xff08;API 9&#xff09;版本开始新增的模型&#xff0c;也是目前HarmonyOS主推且会长期演进的模型。在该模型中&#xff0c;由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”&#xff0c;因此称这…

构建智能电商推荐系统:大数据实战中的Kudu、Flink和Mahout应用【上进小菜猪大数据】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 本文将介绍如何利用Kudu、Flink和Mahout这三种技术构建一个强大的大数据分析平台。我们将详细讨论这些技术的特点和优势&#xff0c;并提供代码示例&#xff0c;帮助读者了解如何在…

投影仪哪个牌子好?怎么选家用投影仪

这两年看我身边好多朋友都买了投影仪&#xff0c;我心里也是痒痒的。他们都说有了投影仪之后再也不用去电影院了&#xff0c;周末在家拉上窗帘&#xff0c;准备一堆甜品奶茶&#xff0c;躺在沙发上就可以开始享受家庭影院了。不过我在想&#xff0c;投影仪的牌子这么多&#xf…

十大国产投影仪品牌:极米、当贝、明基、小米等国产投影仪大牌厂商

投影仪&#xff0c;想必网友都比较熟悉了&#xff0c;目前很多家庭里都购入了投影仪作为观影设备&#xff1b;特别是在近些年&#xff0c;笔者不少朋友也选择投影仪给孩子们使用。经过多年的技术开发与经验累积&#xff0c;国产投影仪已成为高销量、高品质的品牌。 十大国产投…

家用投影仪什么品牌好?投影仪哪家好?

最近好多朋友都在问我家用投影仪什么品牌好。但是我的观点是选任何一个产品都不能只看品牌&#xff0c;一定先要了解如何选择该类产品&#xff0c;才能选出兼顾产品和品牌两个方面的好东西。因此&#xff0c;这篇文章将会先告诉大家如何选择投影仪&#xff0c;然后再给大家介绍…

投影仪参数哪些最重要?什么品牌投影仪好

大家都知道投影仪规格参数多&#xff0c;包括系统配置、显示参数、音效在内&#xff0c;大大小小总共几十个&#xff0c;要是每个都摘出来详细对比的话&#xff0c;也太花功夫了。俗话说得好&#xff0c;打蛇打七寸。与其面面俱到&#xff0c;不如分清主次&#xff0c;抓大放小…

怎么挑选投影仪?高清投影仪什么品牌好

随着家庭智能影院的兴起&#xff0c;投影仪逐渐成为家庭观影的一种新潮流。那么投影仪应该怎么挑选呢&#xff1f; 我们在选择投影仪的时候要注重不同功能参数之间的对比&#xff0c;下面将我自己选择投影仪的一些经验分享给大家。 首先看分辨率&#xff0c;我们都知道分辨率是…

投影仪什么牌子最好?哪款投影仪做家庭影院效果好

这几年来国内新兴的投影仪牌子不计其数&#xff0c;除了几个占据行业领先地位的老牌子之外&#xff0c;很多新起之秀也蓄势待发&#xff0c;在打造极致性价比方面卯足了劲儿&#xff0c;跟大牌竞争。 与其问现在什么牌子的投影仪最好&#xff0c;还不如自己学会看投影仪的参数&…

投影仪哪些比较好?投影仪如何选购

现在在家里装投影仪能提升幸福感&#xff0c;很多小伙伴准备入坑。但看到市场上那么多品牌和款型&#xff0c;不知道投影仪哪些比较好。接下来和大家分享自己的选购经验&#xff0c;后半部分整理出来了口碑比较好的部分产品&#xff0c;希望能帮助大家缩小选择的范围。 挑选指南…

投影仪家里用什么牌子好?哪种投影仪性价比高

人们对生活品质的追求&#xff0c;已经体现在投影仪上。不管是买房还是租房&#xff0c;都可以在家享受大屏电影的体验。可看着这么多牌子&#xff0c;很多人可能不知道怎么选。其实只要会看参数&#xff0c;就能知道投影仪家里用什么牌子好了。 1、显示芯片、分辨率 家里用的…

什么牌子投影仪好?投影仪买什么牌子的好

最近几年投影仪行业发展很快&#xff0c;除了几个传统的品牌&#xff0c;几个新兴的品牌也很受关注。概括起来国内有极米、坚果、大眼橙、明基等&#xff0c;国外有索尼、松下、爱普生。备选一多就容易纠结&#xff0c;很多人问什么牌子投影仪好&#xff0c;下面就分享一下自己…

什么牌子投影仪好?国产投影仪什么牌子好

小巧&#xff0c;智能&#xff0c;易于操作的物品越来越受到人们的喜爱。在科技的进步中&#xff0c;一些影视爱好者也不满足于电影院或者电视等传统观影方式&#xff0c;这也是投影仪越来越受人们欢迎的原因。它兼备了智能化与信息化等多种现代元素&#xff0c;同时能满足观影…

国产家用投影仪十大排名品牌,最新排名整理分享给大家选前要看哦

支持国货现在已然成为国人绝对支持的行为之一&#xff0c;对于像华为、鸿星尔克等国产国货出现火爆的场景&#xff0c;仍然历历在目&#xff01;现在国产国货已经影响着世界&#xff0c;国际友人都爱上了中国造&#xff01;今天小编分享新国货十大国产投影仪品牌排行榜&#xf…

投影仪哪个牌子的好?家庭影院投影仪哪款好

近年来的投影仪市场真的太火爆了&#xff0c;各大平台上都在推各种品牌的投影仪&#xff0c;有的是几百块钱价位的&#xff0c;有的是大几千的&#xff0c;还有上万的。作为一名家电行业的技术人员&#xff0c;个人觉得几百块钱的投影仪真心不能买&#xff0c;连智能系统都没有…