std::ref 是什么?

主要观点:

  • 介绍了std::refstd::crefstd::reference_wrapper,若已了解则此文可能不适合,未了解则值得一读。
  • 说明了std::reference_wrapper的作用,能模拟T&且可复制构造和赋值,还很高效。
  • 阐述了何时使用std::reference_wrapper,可用于在容器中存储引用(如在std::vector中),也可用于向一些标准模板函数传递引用(如std::bindstd::threadstd::make_pair等)。
  • 通过示例展示了std::refstd::cref在不同场景下的差异,不用它们时可能会进行复制而不是传递引用。
    结论:
  • std::refstd::crefstd::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()n1n2被“永久”修改,通过std::function调用时若不用std::ref等则参数为复制,用了则为实际引用。
  • 若喜欢此文可点赞、订阅 newsletter 及在 Twitter 上联系作者,还可成为 Patreon 支持者。
阅读 8
0 条评论