首页 文章

在容器中使用reference_wrapper而不是原始指针的好处?

提问于
浏览
22

使用 std::reference_wrapper 作为容器的模板参数而不是原始指针有什么好处?那是 std::vector<std::reference_wrapper<MyClass> >std::vector<MyClass*>

我喜欢忘记空值而不必使用指针语法,但是类型的详细程度(即 vector<reference_wrapper<MyClass> > )加上调用站点使用std :: ref来包装实际引用会让我觉得它不值得 .

我指的是使用std :: shared_ptr或任何其他智能指针不是一个选项的情况 .

使用reference_wrapper或我目前没有考虑的任何其他因素有其他好处吗? (我认为我的问题适用于C 11的reference_wrapper和boost)

2 回答

  • 0

    我认为没有任何技术差异 . 引用包装器提供基本指针功能,包括动态更改目标的功能 .

    一个好处是它表明了意图 . 它告诉那些阅读代码的人,“谁拥有变量”,实际上并没有控制其生命周期 . 用户没有忘记删除或新的任何东西,有些人在看到指针语义时可能会开始寻找 .

  • 19

    使用模板时,C引用确实存在问题 . 如果你“幸运”到足以编译带有引用的代码作为模板参数,那么代码可能会出现问题(由于某种原因),如下所示:

    template<class T> f(T x) { g(x); }
    template<class T> g(T x) { x++; }
    

    然后,即使你打电话 f<int&>(x) ,它也会调用 g<int> . 但 reference_wrapper 适用于模板 .

    正如前面提到的 - 编译 vector<int&> 之类的东西会有问题,但是 vector<reference_wrapper<int>> 可以正常工作 .

相关问题