将 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>>

我有一个 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定义一个移动赋值运算符吗? class 只包含几个 unordered_maps,一个集合和几个原语。没有指针成员。

您不能 copy-assign 一个包含 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 个副本被销毁,托管指针将 被删除。