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

【C++11】左值引用,右值引用,移动/复制构造,完美转发

左值与右值

字面意思是可以放在等号左边的就是左值,只能放在等号右边的就是右值(为何是“可以”“只能”?例如++i是左值,但他依然可以放在等号右边)。
严格上的定义:可以取地址的就是左值,反之为右值(不具名)。

左值引用

使用方法:在类型后加& 。
只能引用左值,或加const关键字来引用右值,但不能修改,此情况与使用引用的目的相违背(使用引用的目的就是为了修改),所以一般不用。

右值引用

C++11新引入,只能引用右值。
使用方法:在类型后加&&,如T && 。
作用:延长右值生命周期,减少对象的复制,提升性能。

//右值引用
class X {
public:X() {cout << "X()" << endl;}X(const X& x) {cout << "X(const X& x)" << endl;}~X() {cout << "~X()" << endl;}
};X makeX() {X x1;return x1; 
}int main() {X&& x2 = makeX();return 0;
}

以上代码中,调用makeX(),如果不是右值引用需要发生两次拷贝,三次构造,如果用右值引用,makeX()返回的将亡值延长生命周期,只发生一次拷贝,提升性能。但目前很多编译器都已经对此进行了返回值优化,所以在大部分场景无需刻意纠结。

复制构造器与移动构造器

复制构造器形参是一个左值引用。
移动构造器接受一个右值,没有了复制构造中的内存复制。
移动复制构造器的风险:如果一个对象移动到另一个对象时发生异常,造成目标对象不完整,后果无法预测(所以移动构造需要加noexcept关键字)。

class MyString {
public:MyString() :str(nullptr), len(0) {}MyString(const char* ch) :str(nullptr), len(0) {if (ch != nullptr) {len = strlen(ch);str = new char[len + 1];strcpy(str, ch);cout << "Constructor" << endl;}}//拷贝构造函数MyString(const MyString& other) :str(nullptr), len(0) {if (other.str != nullptr) {len = other.len;str = new char[len + 1];strcpy(str, other.str);cout << "Copy Constructor" << endl;}}//移动构造函数MyString(MyString&& other) :str(nullptr), len(0) {str = other.str;len = other.len;other.str = nullptr;other.len = 0;cout << "Move Constructor" << endl;}~MyString() {if (str != nullptr) {delete[] str;str = nullptr;len = 0;}}private:char* str;size_t len;
};int main() {MyString string1("Test");MyString string2(string1);MyString string3(move(string1));return 0;
}

注:使用msvc编译以上代码的时候ide可能会出现如下的错误:

error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

vs中在“项目右键–>属性–>C/C++ -->预处理器–>预处理器定义”中添加上“_CRT_SECURE_NO_WARNINGS”即可。
以上代码中move()的作用:将对象的状态或所有权从一个对象转移到另一个对象,将左值引用转化为右值引用,继而可通过右值引用使用该值,以用于移动语义。

万能引用

形如T&&或auto &&并且发生类型推导的引用,包括模板和auto,如:

	//万能引用template <class T>T test(T&& t){}
auto&& x = get_val();

完美转发

特性:在函数内部完美地转发函数实参原始类型和值类型,也就是说,如果函数传入的实参是左值引用,转发时保持实参的左值引用属性和左值引用类型。
完美转发的原理:基于引用折叠,即,实际类型和模板类型只要有左值引用参与进来,最后推导的结果就是一个左值引用(遇左则左)。
两种实现方式:
(1)使用static_cast:

static_cast<T &&>(t);

(2)使用标准库中forward()方法:

forward<T>(t);

注:forward()与move()的区别:move()将一个实参转换为右值引用,并且move()不需要模板实参。

相关文章:

【C++11】左值引用,右值引用,移动/复制构造,完美转发

左值与右值 字面意思是可以放在等号左边的就是左值&#xff0c;只能放在等号右边的就是右值&#xff08;为何是“可以”“只能”&#xff1f;例如i是左值&#xff0c;但他依然可以放在等号右边&#xff09;。 严格上的定义&#xff1a;可以取地址的就是左值&#xff0c;反之为…...

解决找不到x3daudio1_7.dll的方法,快速解决x3daudio1_7.dll丢失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到x3daudio1_7.dll”。这个问题可能是由于多种原因引起的&#xff0c;例如文件丢失、损坏或被病毒感染等。下面将详细介绍如何解决这个问题。 首先&#xff0c;我们需要了解x3daudio1_…...

LeetCode:2300. 咒语和药水的成功对数(C++)

目录 2300. 咒语和药水的成功对数 题目描述&#xff1a; 实现代码与解析&#xff1a; 二分 原理思路&#xff1a; 2300. 咒语和药水的成功对数 题目描述&#xff1a; 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表…...

【Spring生命周期核心底层源码之剖析】

文章目录 一、Spring生命周期核心底层源码剖析—扫描1.1、Spring底层扫描机制doScan方法源码剖析 一、Spring生命周期核心底层源码剖析—扫描 1.1、Spring底层扫描机制doScan方法源码剖析 其源代码如下&#xff1a; protected Set<BeanDefinitionHolder> doScan(Strin…...

关于Thread.sleep方法的一些使用

Thread.sleep方法的作用就是使当前线程暂停执行一段指定的时间。 它的参数是以ms为单位的时间参数&#xff0c;表示暂停时间长度。如Thread.sleep(1000);表示暂停1s。 这个方法通常用在以下一些情况&#xff1a; 1、模拟延迟&#xff1a;在某些情况下&#xff0c;我们希望在…...

MeterSphere | 前端入参加密

项目场景&#xff1a; 在 MeterSphere 开源框架中&#xff0c;解决前端手机号入参加密 解决方案&#xff1a; 导入 JavaScript 包采用加密算法 导入网上 JavaScript 包 // 1. 通过cdn加载网上的js文件 g new Packages.org.mozilla.javascript.tools.shell.Global(Packages.o…...

微服务如何做负载均衡?

笔者在参与联通某子公司时&#xff0c;遇到了这样一个问题。感觉比较实际&#xff0c;特来记录一波。 先看腾讯混元的解答&#xff1a; 微服务架构中&#xff0c;负载均衡是必不可少的。在微服务中&#xff0c;负载均衡可以通过以下几种方式来实现&#xff1a; 1. DNS轮询&am…...

C++高级编程:构建高效稳定接口与深入对象设计技巧

C高级编程&#xff1a;构建高效稳定接口与深入对象设计技巧 建立稳定接口 类是C中的主要抽象单位。你应该将抽象原则应用于你的类&#xff0c;尽可能将接口与实现分离。具体来说&#xff0c;你应该使所有数据成员私有&#xff0c;并可选择性地提供getter和setter方法。这就是…...

Qt——连接mysql增删查改(仓库管理极简版)

目录 UI布局设计 .pro文件 mainwindow.h main.cpp UI布局设计 .pro文件 QT core gui QT core gui sql QT sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any …...

Panda3d 场景管理

Panda3d 场景管理 文章目录 Panda3d 场景管理有关分层场景图的重要信息NodePathNodePath 以及 Node 的函数调用模型文件文件格式加载模型文件将模型放置在场景图中模型缓存压缩模型异步加载模型通过回调函数进行 常见的状态变化修改节点的位置和姿态改变父级节点改变颜色隐藏和…...

京东数据分析(京东销量):2023年9月京东投影机行业品牌销售排行榜

鲸参谋监测的京东平台9月份投影机市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据数据显示&#xff0c;9月份&#xff0c;京东平台投影机的销量为13万&#xff0c;环比下滑约17%&#xff0c;同比下滑约25%&#xff1b;销售额将近2.6亿&#xff0c;环比下…...

uniapp cli化一键游项目启动报错总结

问题1、使用hbuilder运行指令&#xff0c;开始编译后没有反应&#xff0c;使用命令构建自行结束进程 解决&#xff1a;因为使用了node16.24&#xff0c;卸载重新安装14.17后解决 问题2、 21:31:11.483 Module build failed (from ./node_modules/vue/cli-service/node_module…...

我的月光宝盒初体验失败了

哈哈哈&#xff0c;我爱docker, docker 使我自由&#xff01;&#xff01;&#xff01; docker make me free! 菠萝菠萝蜜口号喊起来。 https://github.com/vivo/MoonBox/ windows上安装好了docker之后&#xff0c;docker-compose是自带的。 docker-compose -f docker-compo…...

vue3+vite搭建后台项目-1 引入element-plus 中文包,打包时报错问题

vue3vite搭建后台项目-1 引入element-plus 中文包,打包时报错问题 终端报错 If theelement-pluspackage actually exposes this module, try adding a new declaration (.d.ts) file containing are moduleelement-plus/dist/locale/zh-cn.mjsdec import zhCn fromelement-plus…...

带你详细了解git的【分支和标签】

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;…...

分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-LSTM粒子群算法优化长短…...

Spring 事务失效的场景

1.直接new出来的对象添加事务不起作用&#xff0c;因为只有spring定义的bean才接受事务。 2.由于mysql的引擎用Myisam不支持事务&#xff0c;所以如果使用mysql的myisam引擎的话&#xff0c;事务不起作用。 3.如果Transaction注解到非public方法上&#xff0c;事务不起作用&…...

酷柚易汛ERP-自定义打印整体介绍

1、产品介绍 每种单据系统预设常用模板&#xff0c;提供A4纸张、三等分、二等分&#xff0c;销货单额外提供80mm、58mm供用户选择&#xff1b;每张单据可设置一个默认模板和多个常用模&#xff1b;除默认模板外&#xff0c;其他模板都允许删除&#xff0c;用户可以根据公司业务…...

activiti命令模式与责任链模式

来源&#xff1a;activiti学习&#xff08;七&#xff09;——命令模式和职责链模式在activiti中的应用 文章目录 设计模式命令模式CommandHelloCommandByeCommand ReceiverInvokerClient 职责链模式AbstractHandlerConcreteHandlerAConcreateHandlerB Client activiti中很多ap…...

C++20 Text formatting

C20 Text formatting 格式化字符串&#xff0c; 和 python 类似。 std::formatter - cppreference.com string — Common string operations — Python 3.12.0 documentation 新格式库位于 <format> 头文件中。格式库基于 Python3 中的 str.format() 方法建模。格式…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...