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

std::move和左值右值

引用:windows程序员面试指南

std::move

std::move 是 C++ 标准库中的一个函数模板,用于将一个左值(左值引用)转化为右值引用,从而实现移动语义。
移动语义是一种可以将资源(如内存)从一个对象转移到另一个对象的方式,而不是进行资源的复制。
移动操作通常比复制操作更高效,对于大型的对象(如容器、字符串等)可以带来很大的性能优势。

左值和右值

在 C++ 中,左值是可以被取地址的表达式,而右值是临时的、不可取地址的表达式。 通常,左值是具有名称、有持久性的,而右值是临时性的、瞬时的。其具体区别如下:

左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体。
右值是在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。
一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。
左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象 。
右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。

移动语义详解

std::move的函数原型定义如下:

template <typename T>
typename remove_reference<T>::type&& move(T&& t) {return static_cast<typename remove_reference<T>::type &&>(t);
}

从本质上讲,我们可以将std::move视为一个左值==》右值的类型转换:

static_cast<T&&>(lvalue) 

首先,函数参数T&&是一个指向模板类型参数的右值引用,通过引用折叠,此参数可以与任何类型的实参匹配(可以传递左值或右值,这是std::move主要使用的两种场景)。关于引用折叠如下:

所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&) 。
所有的其他引用类型之间的折叠都将变成左值引用。 (A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&)。

简单来说,右值经过T&&传递类型保持不变还是右值,而左值经过T&&变为普通的左值引用。

移动语义原理
  1. 首先,通过右值引用传递模板实现,利用引用折叠原理将右值经过T&&传递类型保持不变还是右值,而左值经过T&&变为普通的左值引用,以保证模板可以传递任意实参,且保持类型不变。(cpr:先能够把参数类型全都接收)
  2. 然后我们通过static_cast<>进行强制类型转换返回T&&右值引用,而static_cast之所以能使用类型转换,是通过remove_refrence::type模板移除T&&,T&的引用,获取具体类型T(模板偏特化)。(cpr:再把接收的参数的原引用抹除强转成右引)

相关文章:

std::move和左值右值

引用&#xff1a;windows程序员面试指南 std::move std::move 是 C 标准库中的一个函数模板&#xff0c;用于将一个左值&#xff08;左值引用&#xff09;转化为右值引用&#xff0c;从而实现移动语义。 移动语义是一种可以将资源&#xff08;如内存&#xff09;从一个对象转…...

QT学习备份

2023年1月2日09:00:32 1.信号/槽编辑器 发送者&#xff1a;控件 信号&#xff1a;是控件发出的信号 接受者&#xff1a;包含控件的容器 槽&#xff1a;程序上用slot标识的方法 2.Q_OBJECT宏 只有继承了QObject类的类&#xff0c;才具有信号槽的能力。所以&#xff0c;为了使用…...

【wiki知识库】03.前后端的初步交互(展现所有的电子书)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f4c2;前端配置文件补充 三、&#x1f30f;前端Vue的改造 四、&#x1f4a1;总结 一、&#x1f525;今日目标 在上一篇文章当中&#xff0c;我已带大家把后端的一些基本工…...

AOP——学习

AOP&#xff08;面向切面编程&#xff09;是Spring框架的重要特性之一&#xff0c;用于分离关注点并处理横切关注点&#xff0c;如日志记录、安全性和事务管理。在面试中&#xff0c;AOP相关的问题通常会涉及基本概念、应用场景、实际使用、以及与其他编程范式的比较。以下是一…...

Linux静态库、共享动态库介绍、制作及使用

参考学习&#xff1a;Linux下的各种文件 、动态库基本原理和使用方法&#xff0c;-fPIC选项的来龙去脉 、Linux静态库和动态库分析 文章写作参考&#xff1a;Linux共享库、静态库、动态库详解 - sunsky303 - 博客园 (cnblogs.com) 一.Linux共享库、静态库、动态库详解 使用G…...

【Paddle】稀疏计算的使用指南 稀疏ResNet的学习心得 (2) + Paddle3D应用实例稀疏 ResNet代码解读 (1.6w字超详细)

【Paddle】稀疏计算的使用指南 & 稀疏ResNet的学习心得 Paddle3D应用实例稀疏 ResNet代码解读 写在最前面一、稀疏格式简介1. COO&#xff08;Coordinate Format&#xff09;2. CSR&#xff08;Compressed Sparse Row Format&#xff09; 二、Paddle稀疏张量支持1. 创建 C…...

Linux系统维护

1. 批量安装部署 2. 初始化配置 3. 禁用Selinux 永久更改 SELinux 配置&#xff1a; 编辑 SELinux 配置文件&#xff1a;使用文本编辑器打开 /etc/selinux/config 文件&#xff1a; 在配置文件中&#xff0c;找到 SELINUX… 的行。将其值更改为以下选项之一&#xff1a; e…...

经典文献阅读之--RenderOcc(使用2D标签训练多视图3D Occupancy模型)

0. 简介 3D占据预测在机器人感知和自动驾驶领域具有重要的潜力&#xff0c;它将3D场景量化为带有语义标签的网格单元。最近的研究主要利用3D体素空间中的完整占据标签进行监督。然而&#xff0c;昂贵的注释过程和有时模糊的标签严重限制了3D占据模型的可用性和可扩展性。为了解…...

蓝牙设备中的UUID

文章目录 一、Device UUID二、Service UUID 一、Device UUID Device UUID也可以被称作为DeviceID。 Android 设备上扫描获取到的 deviceId 为外围设备的 MAC 地址&#xff0c;相对固定。iOS 设备上扫描获取到的 deviceId 是系统根据外围设备 MAC 地址及发现设备的时间生成的 …...

网络之再谈体系结构

大家都知道的是网络的体系结构&#xff0c;现代软件常用的体系结构无非是TCP/IP协议栈&#xff0c;OSI因为实现复杂并且效率没有TCP/IP协议栈好&#xff0c;所以不用OSI&#xff0c;但是&#xff0c;最近在复习网络知识的时候&#xff0c;发现了一些奇怪的地方&#xff0c;那就…...

在flutter initState 方法,触发 setState导致循环执行

在Flutter中&#xff0c;如果你在initState中调用了一个方法&#xff0c;并且这个方法可能导致状态更新&#xff0c;这可能会引起无限循环&#xff0c;因为每次状态更新都会再次调用initState。 为了避免这种情况&#xff0c;你应该检查调用的方法是否会导致状态更新&#xff…...

JavaScript字符串方法

charAt() 方法&#xff1a;返回指定索引处的字符。 示例&#xff1a; let str "Hello World"; console.log(str.charAt(0)); // Output: "H" console.log(str.charAt(6)); // Output: "W"charCodeAt() 方法&#xff1a;返回指定索引处字符的 Un…...

YD/T 2698-2014 《电信网和互联网安全防护基线配置要求及检测要求 网络设备》标准介绍

编写背景 随着互联网技术的飞速发展&#xff0c;网络设备的安全问题日益凸显。为了加强电信网和互联网的安全防护&#xff0c;保障网络环境的稳定和用户信息的安全&#xff0c;YD/T 2698-2014标准应运而生。此标准旨在为网络设备提供一套基线配置要求&#xff0c;以及相应的安…...

QCC30XX如何查找本地地址码

查找本地地址段/********************************************************************** Copyright (c) 2016 - 2017 Qualcomm Technologies International, Ltd. FILE NAME sink_private_data.c DESCRIPTION This module works as a container for all private and common…...

基于 DCT 的图像滤波

需求分析 对于图像去噪这一需求&#xff0c;我们可以通过DCT&#xff08;离散余弦变换&#xff09;算法来实现。DCT是一种基于频域的变换技术&#xff0c;可以将图像从空间域转换为频域&#xff0c;然后通过滤波等处理方式进行去噪。 针对这一需求&#xff0c;我们需要进行以下…...

spdlog日志库源码:自定义异常类spdlog_ex

自定义异常类spdlog_ex 标准库异常类&#xff08;std::exception&#xff09;系列&#xff0c;能满足大多数使用异常的场景&#xff0c;但对系统调用异常及错误信息缺乏支持。spdlog通过继承std::exception&#xff0c;扩展对系统调用的支持&#xff0c;实现自定义异常类spdlo…...

3.每日LeetCode-数组类,爬楼梯(Go,Java,Python)

目录 题目 解法 Go Java Python 代码地址&#xff1a;leetcode: 每日leetcode刷题 题目 题号70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff…...

单节点11.2.0.3参数文件恢复到RAC11.2.0.4启动失败

问题描述 通过pfile生成spfile失败&#xff0c;提示DATA磁盘不存在 SQL> create spfileDATA/DXJ/spfiledxj.ora from pfile/home/oracle/initdxj20240529.ora; create spfileDATA/DXJ/spfiledxj.ora from pfile/home/oracle/initdxj20240529.ora * ERROR at line 1: ORA-1…...

Windows电脑高颜值桌面便利贴,便签怎么设置

在这个看颜值的时代&#xff0c;我们不仅在衣着打扮上追求时尚与美观&#xff0c;就连电脑桌面也不愿放过。一张唯美的壁纸&#xff0c;几款别致的小工具&#xff0c;总能让我们的工作空间焕发出不一样的光彩。如果你也热衷于打造高颜值的电脑桌面&#xff0c;那么&#xff0c;…...

代码随想录35期Day54-Java

Day54题目 LeetCode392判断子序列 核心思想:公共子序列长度达到需要判断的字符串的长度,说明是子序列 class Solution {public boolean isSubsequence(String s, String t) {if("".equals(s)) return true;int[][] dp new int[s.length()1][t.length()1];for(int…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...