左值,右值和移动语义

news/2025/10/15 15:56:46/文章来源:https://www.cnblogs.com/wsdanshenmiao/p/19139714

左值、右值和移动语义

左值和右值

C++的表达式分为左值表达式和右值表达式,右值又分为纯右值将亡值

左值和右值的定义:

  • 指代非临时对象且不可移动的表达式被称为左值表达式;当对象被用左值时,被使用的是对象的身份(在内存中的位置)。
  • 指代非临时对象且可移动的表达式被称为将亡值表达式;当对象被用作将亡值时,被使用的是对象的值(内容)。
  • 指代临时对象且可移动的表达式被称为纯右值表达式;做纯右值时被使用的是对象的值

常见的左值:

  1. 赋值运算符的左侧运算对象为左值,得到的结果也是左值。
  2. 内置解引用运算符(*),下标运算符([]),迭代器解引用运算符,string和vector的下标运算符的求职结果都是左值。
  3. 内置类型和迭代器的递增递减运算符作用于左值运算对象。

常见的右值:

  1. 对一个左值运算对象取地址返回一个右值。
  2. 字面量(字符字面量除外,字符字面量在内存中有自己的地址)。

移动语义

我们在编写程序时经常会拷贝对象,被拷贝的对象体量大或是对象本身要求分配内存空间时会造成很大的开销,并且有时在拷贝后不需要先前的对象,这是对象拷贝就显得很没有必要了,由此在C++11中引入了对象移动。

右值引用和左值引用

对象移动具体是通过右值引(&&)用实现的,右值引用就是必须绑定到右值上的引用,与之相对的是左值引用(也称为常规引用)。

当使用拷贝构造或拷贝赋值时,会造成拷贝可开销:

String(const String& string)
{std::cout << "Copy\n";m_Size = string.m_Size;m_Data = new char[m_Size];memcpy(m_Data, string.m_Data, m_Size);
}

但若使用移动构造,则可避免这些开销:

String(String&& string)
{printf("Move\n");m_Size = string.m_Size;m_Data = string.m_Data;string.m_Data = nullptr;	//防止重复析构string.m_Size = 0;
}

使用移动赋值时要注意释放先前的空间和确保在赋值自身时不会丢失数据:

String& operator=(String&& string)
{printf("Move\n");if (this != &string) {	//确保在赋值自身时不会丢失数据delete[] m_Data;	//释放先前的空间m_Size = string.m_Size;m_Data = string.m_Data;string.m_Data = nullptr;	//防止重复析构string.m_Size = 0;}return *this;
}

但移动构造和移动赋值只能接收右值,如当把name中的函数复制到m_Name时,不会调用移动拷贝,因为name虽然是右值引用类型,但它因有变量名而不是临时对象,被判定成左值

Entity(String&& name):m_Name(name) {}

这时就要将其强转成右值,C++11提供了std::move函数将左值转为右值由此使用std::move即可调用到拷贝构造。

Entity(String&& name):m_Name(std::move(name)) {}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年千斤顶厂家最新权威推荐排行榜:液压千斤顶、机械千斤顶、电动千斤顶源头厂家综合实力深度解析

2025年千斤顶厂家最新权威推荐排行榜:液压千斤顶、机械千斤顶、电动千斤顶源头厂家综合实力深度解析行业背景与发展趋势千斤顶作为工业领域不可或缺的起重设备,其技术发展与制造业升级息息相关。随着基础设施建设的持…

VKD104CR是永嘉微VINKA推出低功耗2路触摸芯片该芯片具有较高的集成度

VKD104CR是2通道触摸检测芯片,功耗低、工作电压范围宽以及稳定的触摸检测效果可以广泛的满足不同应用的需求,此触摸检测芯片是专为取代传统按键而设计,内建稳压电路,提供稳定电压给触摸检测电路使用,触摸检测PAD的…

Cookie如何设置HTTPOnly和Secure 以防止XSS跨站脚本攻击

设置HttpOnly和Secure标志于Cookie中是增强Web应用安全性的重要措施。这两个标志帮助防止跨站脚本攻击(XSS)和中间人攻击(MitM)。下面是关于如何设置这些标志的具体步骤: PHP: 在发送cookie时使用setcookie()函数…

STM32学习路线!600+讲课程!软硬件兼修:裸机+RTOS+LVGL+硬件设计+项目实战 (STM32多核心开发板)

私信小编,备注“103开发板”,免费领取教程/源码/项目资料~ 在智能设备深度整合与万物互联加速推进的当下,STM32正从单一功能控制走向复杂系统集成。从智能家居的精准传感控制到工业物联网的实时数据采集,从AIoT终端…

Vue中展示字符串,有换行符的怎么换行展示

Vue中展示字符串,有换行符的怎么换行展示1 简介 1)字符串带了换行符 "你好\r\nhello\r\nworld" 2)使用{{}}直接展示{{rowdetail.lastWeekContent}} 3)展示效果发现没有换行 2 处理 1)使用<pre&g…

zerotier自建planet内网穿透详细配置教程 - IT苦行僧

zerotier自建planet内网穿透详细配置教程 配置过程,遇到不懂的问题,可以直接复制代码或者报错信息给AI,帮助你答疑解惑。 前言 本文使用Zerotier,这个软件官方也提供免费通道,但是很不稳定,所以本文是自建Planet…

【2025-10-11】适应变化

20:00劳作是眼能看见的爱。如果你进行劳作时不是满怀着爱,而是带着厌恶心里,还不如丢下工作,到庙门去等待高高兴兴劳作者们的周济——纪伯伦人性最厌讨的事物之一就是变化。但是,人类的发展只能依靠变化。所以,克…

C语言的学习——常量

常量的输出方式有四种 1.第一种是输出整数整数的输出需要用d来表示占位符 2.第二种是输出小数小数的输出需要用f来表示占位符 3.第三种是输出字符字符的输出需要用c来表示占位符,同时也需要用引号来引注输出的内容 4.…

会充电的CANoe,高效完成即插即充(PnC)智能充电功能测试

ISO 15118-2标准中描述的PnC功能,可以实现插枪即充电,识别、计费信息、充电参数都通过高级别通信在EV和EVSE之间自动交换。简化了电动汽车的充电过程,提高了用户体验,为电动汽车行业带来了更智能、更便捷的充电解决…

Bridge 2025超详细保姆级下载安装全教程(含软件下载)

目录一、Adobe Bridge 2025 软件介绍二、Adobe Bridge 2025 下载方式三、Adobe Bridge 2025 详细安装步骤步骤 1:解压 Bridge 2025 安装包步骤 2:以管理员身份运行安装程序步骤 3:选择是否修改安装路径步骤 4:自定…

legit torrents, legit trackers

http://www.legittorrents.info/ is dead.but that site recommends the following ones:PlaneShift Revision3 gameupdates.org vodo.net Pure Pwnage Cube 2: Sauerbraten Linuxtracker Public Domain Torrents

python 数学计算 32位精度

from decimal import Decimal, getcontext# Set precision high enough to handle 32 decimal places getcontext().prec = 50# Calculate step by step result = Decimal(20) / Decimal(6) / Decimal(3) / Decimal(3)…

2025年锅炉厂家最新权威推荐榜:燃气采暖锅炉/电热水锅炉/生物质锅炉/真空热水锅炉/蒸汽发生器全品类深度解析

2025年锅炉厂家最新权威推荐榜:燃气采暖锅炉/电热水锅炉/生物质锅炉/真空热水锅炉/蒸汽发生器全品类深度解析行业背景与发展趋势锅炉作为工业生产与民用供热领域的核心设备,其技术发展与市场需求正经历深刻变革。随着…

容器技术k8s - 指南

容器技术k8s - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…

c语言之对齐函数代码示例

#define ALIGNMENT 8// 内存对齐:将size向上对齐到最近的ALIGNMENT倍数 static size_t align_size(size_t size) {if(size==0)return ALIGNMENT;// 对齐公式:(size + 对齐数 - 1) & ~(对齐数 - 1)return (size +…

PyAutoGUI库自动化测试脚本工具模拟键盘鼠标操作

PyAutoGUI主要用于模拟鼠标和键盘操作,支持Windows、macOS和Linux桌面环境。 其所有用法尽在此处:import pyautogui import timedef moveDemo():print("鼠标位置:",pyautogui.position()) # 显示当前鼠标…

什么是Barriers IO

什么是Barriers I/O 目录什么是Barriers I/O1. 为什么需要 Barriers I/O?2. Barriers I/O 的核心原理3. 应用场景:哪里会用到它?4.Barriers I/O 与普通 I/O 核心差异对比表5.Barriers I/O 启用与验证操作指南(Linu…

2025 年床上用品厂家最新推荐排行榜:从老牌实力到新锐创新的品质之选,涵盖批发与婚嫁选购指南

当下床上用品市场呈现 “新旧交织” 的复杂格局:一方面老牌品牌阵营中,部分产品固守传统工艺,难以适配年轻群体的个性化需求;另一方面近五年涌现的新锐品牌凭借技术创新快速崛起,但消费者对其品质与服务缺乏有效认…

现代C++对象工厂模式实现解析

View Post现代C++对象工厂模式实现解析这篇文章将介绍一个基于现代C++特性的对象工厂实现方案,该方案采用了模板元编程和静态注册技术,为创建对象提供了灵活且类型安全的机制。 核心设计理念这个工厂模式实现包含三个…

MySQL中NULL值的5个反直觉行为,扭到了吗?

核心原则:NULL和任何值比较(=、!=、>、<),结果都是NULL,不是TRUE也不是FALSE。1、NULL = NULL 返回NULL 正确的NULL判断 -- ❌ 错误写法 SELECT * FROM user WHERE phone = NULL; -- 0 rows(查不到任何数据…