使用 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 回答
我认为没有任何技术差异 . 引用包装器提供基本指针功能,包括动态更改目标的功能 .
一个好处是它表明了意图 . 它告诉那些阅读代码的人,“谁拥有变量”,实际上并没有控制其生命周期 . 用户没有忘记删除或新的任何东西,有些人在看到指针语义时可能会开始寻找 .
使用模板时,C引用确实存在问题 . 如果你“幸运”到足以编译带有引用的代码作为模板参数,那么代码可能会出现问题(由于某种原因),如下所示:
然后,即使你打电话
f<int&>(x)
,它也会调用g<int>
. 但reference_wrapper
适用于模板 .正如前面提到的 - 编译
vector<int&>
之类的东西会有问题,但是vector<reference_wrapper<int>>
可以正常工作 .