主要观点:
- 介绍了
std::ref
和std::cref
及std::reference_wrapper
,若已了解则此文可能不适合,未了解则值得一读。 - 说明了
std::reference_wrapper
的作用,能模拟T&
且可复制构造和赋值,还很高效。 - 阐述了何时使用
std::reference_wrapper
,可用于在容器中存储引用(如在std::vector
中),也可用于向一些标准模板函数传递引用(如std::bind
、std::thread
、std::make_pair
等)。 - 通过示例展示了
std::ref
和std::cref
在不同场景下的差异,不用它们时可能会进行复制而不是传递引用。
结论: std::ref
和std::cref
是std::reference_wrapper
的辅助函数,可用于在标准容器中存储引用,也可用于向模板和各种辅助函数传递引用,不用它们时代码看似能工作但可能进行了复制。
关键信息:std::reference_wrapper
可模拟T&
,可复制构造和赋值,默认分配器下指针到引用非法但指针到std::reference_wrapper
实例合法。- 在容器中存储引用需使用
std::reference_wrapper
,如std::vector<std::reference_wrapper<std::string>>
。 - 向
std::bind
等函数传递引用时,不用std::ref
等可能进行复制,用了则可传递实际引用。
重要细节: - 示例中
f()
函数接收引用参数,直接调用f()
时n1
和n2
被“永久”修改,通过std::function
调用时若不用std::ref
等则参数为复制,用了则为实际引用。 - 若喜欢此文可点赞、订阅 newsletter 及在 Twitter 上联系作者,还可成为 Patreon 支持者。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。