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

Benefits of using reference_wrapper instead of raw pointer in containers?

本文关键字:原始 指针 wrapper reference      更新时间:2023-10-16

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

我喜欢忘记null,不必使用指针语法,但类型(即vector<reference_wrapper<MyClass> >)的冗长,加上调用站点使用std::ref来包装实际引用,这让我觉得不值得

我指的是使用std::shared_ptr或任何其他智能指针都不是一种选择的情况。

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

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

一个好处是它展示了意图。它告诉阅读代码的人,"谁"拥有变量,实际上并不是在控制它的寿命。用户没有忘记删除或新建任何内容,有些人在看到指针语义时可能会开始查找这些内容。

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>>工作得很好。