主要观点:
- 介绍了
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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。