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

“c++11“,右值,右值引用,可变参数模板...

博主c++学习笔记,碎碎念:

本篇适合稍稍了解了右值引用,但还想看看别人是怎么想的人。

主要有关于右值理解,移动语义,完美转发;可变参数模板,lambad,包装器,后续还会写一下智能指针部分的笔记。

“第一次学c++11部分知识都是大半年前了,现在才把笔记补上,QAQ,”

关于列表初始化,太简单了,看一遍就懂了没必要记录;


右值,右值引用,移动语义,完美转发

个人理解:

值类别 - cppreference.com,右值概念

c++11引入了“右值引用”概念,为了什么?

假如你要设计一个class类,它既要深拷贝的拷贝构造,又要浅拷贝的拷贝构造(当一个对象里面的资源需要转移的时候),是不是很尴尬?

你要面临的是自己设计一套成员函数啥的去满足,代码会很丑陋,而且使用的时候还得分出一份精力去考虑是深拷贝还是浅拷贝,并且联动STL标准库的时候更难受了,c++11之前STL标准库的构造仅有左值引用的深拷贝,和你造的这个class结合到一块使用只能调用拷贝构造(比如vector的拷贝构造调用了你写的这个class的拷贝构造,但你压根都没拷贝构造,你为了深拷贝和浅拷贝,都另外设计了一套成员函数),这又要逼迫你去继承STL标准库,然后去扩展你的这套深拷贝,浅拷贝的成员函数以实现,正确的调用(深拷贝成员函数调用深拷贝成员函数,浅拷贝成员函数调用浅拷贝成员函数)。以上你辛辛苦苦实现了之后还要面对日常使用上的美观损失,实在是遭罪。

ps赋值拷贝也是如此,(不要想着一个赋值用浅拷贝,拷贝构造用深拷贝,有些人设计的时候赋值直接就是调用的拷贝构造)

好在c++11引入右值引用解决了这个问题,即提升了效率,又使代码变得美观了。

c++11之后,类里面多了“移动构造和移动赋值构造”,长下面这样:

ClassName(ClassName&& other) {// 转移资源// 释放other的资源
}ClassName& operator=(ClassName&& other) {if (this != &other) {// 释放当前对象的资源// 转移资源// 释放other的资源}return *this;
}

多了个&&的新符号,它就是与&相对的右值引用,接下来,看一看右值的概念(纯右值和将亡值值类别 - cppreference.com 和前面的链接是一样的)你就会豁然开朗,


移动语义就是上面的转移资源的“浅拷贝”,

完美转发的出现是因为右值引用产生的变量是左值,这在层层扩展包装的c++中,不能将这个右值引用产生的变量,直接传递到下一层(因为它算左值,直接传递,下一层就错误了,本该是调用右值的那个,反而错误的调用了左值的版本),解决这个的方法称为完美转发,

std::forward<T>(arg) //argument 参数的简写,遇得到看不懂命名的要查,

好了剩下的都很简单,不写了,


可变参数模板

简单的写一下博主自己想要记的:

递归处理。

  • (GetArg(args)...) 会将参数包展开,生成一系列 GetArg 函数的调用,例如 GetArg(arg1), GetArg(arg2), ...
  • 可以使用 ... 来展开参数包。例如,sum(args...) 会将参数包 args 展开为多个参数,传递给 sum 函数。

剩下的lambad,包装器,知识点不多,写了和别人的也一模一样,鸽了,

智能指针先鸽了

http://www.xdnf.cn/news/269659.html

相关文章:

  • GPU集群监控系统开发实录:基于Prometheus+Grafana的算力利用率可视化方案
  • 第15章 对API的身份验证和授权
  • 论系统安全架构设计及其应用
  • 【KWDB 创作者计划】使用Docker实现KWDB数据库的快速部署与配置
  • vLLM 本地部署Qwen大模型
  • ES6语法
  • 【大模型面试每日一题】Day 7:为什么大模型训练选择 Adam 而非 SGD?Adam 的关键改进是什么?
  • 被低估的AI+数据标注
  • DeepSeek辅助学术写作之修订与校稿以及发表与推广相关提示词分享祝你顺利毕业~
  • 介绍最前沿的人工智能创新,‘无反向传播’神经网络训练方法?
  • 53、【OS】【Nuttx】编码规范解读(一)
  • [蓝桥杯真题题目及解析]2025年C++b组
  • 计组复习笔记 3
  • 《计算机系统结构》考题知识点整理
  • 经典算法 求解台阶问题
  • 【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
  • AUTOSAR图解==>AUTOSAR_SRS_CoreTest
  • Python----卷积神经网络(LeNet-5的手写体识别)
  • 降维大合集
  • 使用PageHelper实现分页查询(详细)
  • 【多线程】计算机工作原理、操作系统(内含进程、PCB属性、进程调度、内存分配、进程间的通信) —— 简单介绍
  • Nginx相关知识
  • Space Engineers 太空工程师 [DLC 解锁] [Steam] [Windows]
  • 突破养生误区迷障,开启科学养生新程
  • Pytorch-CUDA版本环境配置
  • 实验-组合电路设计1-全加器和加法器(数字逻辑)
  • 冒泡排序详解:从零理解其核心思想与循环设计原理
  • 【信息系统项目管理师-论文真题】2012下半年论文详解(包括解题思路和写作要点)
  • 2025年 蓝桥杯省赛 Python A 组题目
  • 使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例