将 std::vector<std::unique_ptr<T>> 分配给另一个 std::vector<std::unique_ptr<T>>

Assign std::vector<std::unique_ptr<T>> to another std::vector<std::unique_ptr<T>>

本文关键字:lt gt std ptr unique vector 另一个 分配      更新时间:2023-10-16

我有一个std::vector<std::unique_ptr<MyClass>>,我将其分配给相同类型的第二个向量。

我遇到此编译器错误:

/opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algobase.h:324:18: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = MyClass; _Dp = std::default_delete<MyClass>]'
        *__result = *__first;

这是因为要进行分配,我需要为MyClass定义移动分配操作员?该类仅包含几个Unordered_maps,一个集合和几个原语。没有指针成员。

您不能将std::unique_ptr元素的向量复制到另一个元素,因为您不能复制std::unique_ptr本身。这是唯一的!

您的MyClass上没有定义的操作可以改变此事实。

您可以从这样的向量移动 - 但这意味着原始向量将不再容纳那些std::unique_ptr元素。

unique_ptr,顾名思义,不可复制。只有一个实例可以存在。结果,您无法复制包含unique_ptr元素的向量,因为它们无法从一个向量复制到另一个矢量。您只能将一个向量移至另一个向量:

dest_vector = std::move(src_vector);

src_vector之后无法使用(除了将新事物移入其中。(它包含的所有元素都移至dest_vector中。

如果您实际想要副本,请改用shared_ptr。每个副本仍将管理相同的指针,并将跟踪存在多少副本。一旦所有shared_ptr副本都已破坏,托管指针将仅被删除。