在容器中使用reference_wrapper而不是原始指针的好处
Benefits of using reference_wrapper instead of raw pointer in containers?
使用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>>
工作得很好。
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 为包含原始指针的对象C++智能指针
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 将原始指针传递给接受unique_ptr作为参数的函数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 更改保留指向其字段的原始指针的对象地址
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?