【C++】 C++11:左值、右值,移动语义与完美转发
目录一、左值与右值二、左值引用的短板三、右值引用与移动语义移动语义变“复制”为“窃取”移动构造与移动赋值示例四、强制“窃取”std::move() 的妙用五、完美转发与 std::forward1. 披着右值皮的“万能引用”2. 属性退化的痛点3. std::forward 完美转发总结核心考点在 C 的学习路线上C11 是一次极其重要的进化。相比于 C98/03C11 包含了约 140 个新特性能更好地用于系统开发和库开发提升程序员的开发效率。而在这些新特性中右值引用和移动语义无疑是最核心、也是最能带来性能飞跃的语法特性。一、左值与右值在了解引用之前我们必须先分清什么是“左值”什么是“右值”左值是一个表示数据的表达式如变量名或解引用的指针。我们可以获取它的地址可以对它赋值。左值可以出现在赋值符号的左边。右值也是一个表示数据的表达式如字面常量、表达式返回值、函数返回值等。右值不能出现在赋值符号左边不能取地址。inta10;// a 是左值10 是右值int*pnewint(0);// p 和 *p 是左值intba10;// a 10 的结果是一个右值二、左值引用的短板传统的 C 语法中就有引用的语法C11 中新增了右值引用语法特性因此我们之前学习的引用就叫做左值引用使用表示。无论左值引用还是右值引用都是给对象取别名。左值引用在做函数参数和做返回值时都可以提高效率。但是它有一个致命的短板当函数返回对象是一个局部变量出了函数作用域就不存在了就不能使用左值引用返回只能传值返回。stringto_string(intvalue){string str;// ... 将 value 转换为字符串放入 strreturnstr;// 出作用域 str 被销毁只能传值返回}传值返回会导致至少 1 次拷贝构造如果是一些旧一点的编译器可能是两次拷贝构造。对于包含大量堆内存数据的容器或字符串这种深拷贝极其拖累程序效率。三、右值引用与移动语义为了补齐左值引用的短板C11 提出了右值引用使用表示也就是对右值的引用给右值取别名。intrr110;doublerr2xy;移动语义变“复制”为“窃取”有了右值引用我们可以增加移动构造和移动赋值函数。移动构造本质是将参数右值的资源窃取过来占位已有那么就不用做深拷贝了。所以它叫做移动构造就是窃取别人的资源来构造自己从而提高效率。移动构造与移动赋值示例在自定义string类中移动构造和移动赋值是这样工作的// 拷贝构造深拷贝性能开销大string(conststrings):_str(nullptr){stringtmp(s._str);swap(tmp);}// 移动构造窃取资源快如闪电string(strings):_str(nullptr),_size(0),_capacity(0){// 直接调用 swap 交换指针接管资源swap(s);}// 移动赋值窃取资源stringoperator(strings){swap(s);return*this;}intmain(){bit::string retbit::to_string(1234);//调用移动构造bit::string ret1;ret1bit::to_string(1234);//调用移动构造和移动赋值return0;}当执行bit::string ret bit::to_string(1234);时编译器会识别出to_string的返回值是一个右值如果既有拷贝构造又有移动构造调用就会匹配调用移动构造没有新开空间拷贝数据所以效率提高了。当执行bit::string ret1; ret1 bit::to_string(1234);时我们看到调用了一次移动构造和一次移动赋值。因为如果是用一个已经存在的对象接收编译器就没办法优化了。bit::to_string函数中会先用str生成构造生成一个临时对象但是我们可以看到编译器很聪明的在这里把str识别成了右值调用了移动构造。然后在把这个临时对象做为bit::to_string函数调用的返回值赋值给ret1这里调用的移动赋值。STL中的容器都是增加了移动构造和移动赋值四、强制“窃取”std::move() 的妙用按照语法右值引用只能引用右值。但当我们需要用右值引用去引用一个左值实现移动语义时可以通过std::move()函数将左值转化为右值。C11 中的std::move()函数名字具有迷惑性它并不搬移任何东西唯一的功能就是将一个左值强制转化为右值引用然后实现移动语义。strings1(hello world);// 我们把 s1 move 处理以后会被当成右值调用移动构造strings3(std::move(s1));// 警告这里要注意一般不要这样用因为 s1 的资源被转移给了 s3s1 被置空了五、完美转发与 std::forward当我们把右值引用和模板结合在一起时会发生一些奇妙的化学反应。在这里我们必须要了解一个概念万能引用与完美转发。1. 披着右值皮的“万能引用”在模板中并不总是代表右值引用。模板中的是万能引用其既能接收左值又能接收右值。templatetypenameTvoidPerfectForward(Tt){// 这里的 t 既能接收左值也能接收右值}2. 属性退化的痛点模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力。但是这里存在一个巨大的坑引用类型的唯一作用就是限制了接收的类型后续使用中都退化成了左值。也就是说即使你给PerfectForward传了一个右值在函数内部t有了名字它可以被取地址它本身就变成了一个左值。如果我们在这时继续把t传给底层的其他函数底层函数永远只会把它当成左值处理原本的右值属性丢失了移动语义也就无法触发。3. std::forward 完美转发我们希望能够在传递过程中保持它的左值或者右值的属性就需要用完美转发。C11 提供了std::forward。std::forwardT(t)在传参的过程中保留对象原生类型属性如果你原来是左值传下去还是左值如果你原来是右值传下去依旧是右值。voidFun(intx){cout左值引用endl;}voidFun(intx){cout右值引用endl;}templatetypenameTvoidPerfectForward(Tt){// std::forwardT(t) 在传参的过程中保持了 t 的原生类型属性Fun(std::forwardT(t));}intmain(){inta10;PerfectForward(a);// a 是左值Fun 会打印 左值引用PerfectForward(std::move(a));// move(a) 是右值Fun 会打印 右值引用return0;}完美转发在 STL 的很多底层实现比如可变参数模板、emplace_back等中被大量使用它是 C11 高效泛型编程的基石。总结核心考点左值引用只能引用左值但const左值引用既可引用左值也可引用右值其短板是当函数返回局部对象时只能传值返回。右值引用只能引用右值但是可以引用 move 以后的左值。移动构造/移动赋值本质是将参数右值的资源窃取过来不用做深拷贝完美解决了传值返回导致的性能瓶颈。std::move()的唯一功能就是将一个左值强制转化为右值引用用于实现移动语义。

相关新闻

电容器跳闸原因分析与预防维护全攻略

电容器跳闸原因分析与预防维护全攻略

1. 电容器跳闸问题的典型表现与初步判断当配电系统中电容器出现跳闸时,通常伴随着以下可观察现象:配电柜中电容器支路的断路器或熔断器动作断开,功率因数表显示数值异常下降(可能从0.95骤降至0.8以下),同时…

2026/7/28 14:12:49阅读更多 →
MicroPython条件与循环:嵌入式编程的逻辑基石与实战技巧

MicroPython条件与循环:嵌入式编程的逻辑基石与实战技巧

1. 从“顺序执行”到“智能决策”:为什么需要条件与循环?写代码,本质上是在教计算机做事。最开始,我们写的代码就像一份简单的食谱清单,计算机从上到下,一行一行地执行,这就是“顺序执行”。比如…

2026/7/28 14:12:49阅读更多 →
python上传文件到OSS

python上传文件到OSS

需要先pip install oss2OssUpload.py#!/usr/bin/python # -*- coding: UTF-8 -*-import datetime import oss2access_key_id LLL access_key_secret KKK bucket_name switch endpoint oss-cn-beijing.aliyuncs.com username switch111.onaliyun.comdef uploadFile(fileNam…

2026/7/28 14:10:48阅读更多 →
不会写代码也能做AI副业?揭秘ChatGPT+Notion+Canva组合拳,1人1天产出20条爆款内容

不会写代码也能做AI副业?揭秘ChatGPT+Notion+Canva组合拳,1人1天产出20条爆款内容

更多请点击: https://kaifayun.com 第一章:AI副业的本质与新手认知跃迁 AI副业并非简单地“用AI工具接单”,而是一场认知结构的重构——从执行者转向问题定义者、提示工程师与价值整合者。当多数人还在追问“哪个AI能帮我写周报”时&#xf…

2026/7/28 15:23:23阅读更多 →
fink  操作

fink 操作

https://blog.csdn.net/dataastron/article/details/70151683

2026/7/28 15:23:23阅读更多 →
快速搭建数据科学环境之mac docker kaggle image环境配置与使用  VSCode+Docker: 打造最舒适的深度学习环境

快速搭建数据科学环境之mac docker kaggle image环境配置与使用 VSCode+Docker: 打造最舒适的深度学习环境

1 安装 1.1 安装docker brew cask install docker1.2 拉取kaggle镜像,目前只有cpu版本的 docker run --rm -it kaggle/python2 运行 2.1 运行jupyter-notebook docker run -v $PWD:/tmp/working -w/tmp/working -p 8888:8888 --rm -it kaggle/python jupyter n…

2026/7/28 15:23:23阅读更多 →
AI芯片战争进入“存算一体”终局阶段(英伟达/寒武纪/壁仞技术代差全对比):2025算力采购决策红宝书

AI芯片战争进入“存算一体”终局阶段(英伟达/寒武纪/壁仞技术代差全对比):2025算力采购决策红宝书

更多请点击: https://intelliparadigm.com 第一章:AI芯片战争进入“存算一体”终局阶段的范式跃迁 传统冯诺依曼架构在AI大模型推理中遭遇“内存墙”瓶颈:GPU每秒需搬运TB级数据,90%能耗消耗于数据搬运而非计算。存算一体&#x…

2026/7/28 15:23:23阅读更多 →
高效课堂笔记整理法:康奈尔笔记与数字化处理

高效课堂笔记整理法:康奈尔笔记与数字化处理

1. 课堂笔记整理方法论 作为一名教育行业从业者,我深知有效的课堂笔记对学习效果的重要性。今天想分享一套经过多年实践验证的笔记整理方法,特别适合3月30日这类春季学期关键节点的课程内容记录。 1.1 课前准备要点 工欲善其事,必先利其器。…

2026/7/28 15:23:23阅读更多 →
获取dom元素操作整理

获取dom元素操作整理

文章目录获取元素属性和方法方法jQuery方法属性jQuery方法增删改操作创建添加克隆删除jQuery方法自定义属性jQuery修改样式jQuery方法document可以获取的盒子模型属性js盒子模型获取指定元素的 CSS 样式jQuery方法获取元素属性和方法 整理与参考 方法 document.getElementBy…

2026/7/28 15:21:23阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →