使用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的)
答案 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>>
工作正常。