C++ std::ref 学习笔记
1|0std::reference_wrapper
std::reference_wrapper
是 C++ 标准库中一个特殊的类模板,它的核心目的是将引用包装成一个可以复制、可以赋值的对象。这种设计解决了 C++ 中普通引用(T&
)的一些局限性,尤其是在需要传递或存储引用语义的场景中。
1|1为什么需要 std::reference_wrapper?
在 C++ 中,普通引用(T&
)有以下限制:
- 不能直接存储在容器中:例如
std::vector<T&>
是无效的。 - 不能直接复制或赋值:引用本身不是对象,只是一个别名。
- 模板参数推导的局限性:当模板函数需要按值传递参数时,引用语义会丢失。
std::reference_wrapper<T>
通过将引用包装成一个对象,解决了这些问题:
- 可以存储在容器中:例如
std::vector<std::reference_wrapper<T>>
是合法的。 - 可以复制和赋值:它本身是一个对象,满足可复制构造和可复制赋值。
- 隐式转换为原始引用:在使用时,可以无缝转换为
T&
,保持引用语义。
特性 | 普通引用 (T& ) |
std::reference_wrapper<T> |
---|---|---|
是否可复制 | 否 | 是 |
是否可存储到容器 | 否 | 是 |
是否隐式转换到 T& |
本身就是 T& |
是(通过隐式转换) |
是否为对象 | 否(是别名) | 是(是对象) |
1|2std::reference_wrapper 的核心特性
创建
std::reference_wrapper
可由std::ref,std::cref
创建
可复制、可赋值的对象
隐式转换为原始引用
显式获取引
1|3典型使用场景
将引用存储在容器中
与STL算法结合
绑定到需要引用的函数
比如std::bind, std::thread
这些函数默认是传值,如果你真的需要传引用可以用std::ref
显示的传引用。
这种用户也可以使得与第三方库(如Boost
库)保持行为一致,确保代码可移植性。
与不可复制的对象交互
1|4触发隐式类型转换的条件
-
传递给接受
T&
的函数参数 -
赋值给
T&
类型的变量 -
在需要
T&
的模板类型推导中
__EOF__

本文作者:PHarr
本文链接:https://www.cnblogs.com/PHarr/p/18733020.html
关于博主:前OIer,SMUer
版权声明:CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
本文链接:https://www.cnblogs.com/PHarr/p/18733020.html
关于博主:前OIer,SMUer
版权声明:CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律