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

时间:2012-02-05 12:59:33

标签: c++ stl c++11

使用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 :(得分:20)

我认为没有技术的区别。引用包装器提供基本指针功能,包括动态更改目标的功能。

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

答案 1 :(得分:0)

使用模板时,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>>工作正常。