【发布时间】:2018-09-07 12:32:26
【问题描述】:
我经常遇到需要创建多态对象的数组或向量。我通常更喜欢使用对基类的引用,而不是智能指针,因为它们往往更简单。
数组和向量被禁止包含原始引用,因此我倾向于使用指向基类的智能指针。但是,也可以选择使用std::reference_wrapper:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
从文档中我可以看出,这是它的预期用途之一,但是当涉及到包含多态对象的数组的话题时,常见的建议似乎是使用智能指针而不是std::reference_wrapper。
我唯一的想法是智能指针可能能够更整洁地处理对象的生命周期?
TL:DR;为什么在创建多态对象数组时,像std::unique_ptr 这样的智能指针似乎比std::reference_wrapper 更受欢迎?
【问题讨论】:
-
如果对象在其他地方拥有,
reference_wrapper很好。但是,如果此容器拥有对象并控制其生命周期,则必须使用智能指针,例如unique_ptr-reference_wrapper不提供任何所有权语义。 -
unique_ptr 管理所拥有对象的生命周期,reference_wrapper 存储指向该对象的指针。使用 unique_ptrs 保证对象的释放!
-
引用只是一个引用,仍然需要有人照顾对象的生命周期。使用智能指针,您可以立即获得所需的一切
-
其实你的问题已经有了答案。唯一要补充的是,它不是关于“更整洁”,而是引用根本不处理生命周期
-
std::reference_wrapper作为容器元素类型与常规哑指针相比没有任何优势,除了引用包装不能为空。
标签: c++ arrays reference polymorphism smart-pointers