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

时间:2019-06-25 17:56:27

标签: c++ c++11 move move-semantics unique-ptr

我有一个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,一个集合和几个基元。没有指针成员。

2 个答案:

答案 0 :(得分:8)

您无法将std::unique_ptr个元素的向量复制分配给另一个,因为您不能复制std::unique_ptr本身。这是独一无二的!

MyClass上定义的任何操作都不能改变这一事实。

尽管您可以从这样的向量中移出-但这意味着原始向量将不再包含那些std::unique_ptr元素。

答案 1 :(得分:3)

顾名思义,

unique_ptr是不可复制的。只能存在一个实例。结果,您无法复制包含unique_ptr个元素的向量,因为它们无法从一个向量复制到另一个向量。您只能将一个向量移动到另一向量:

dest_vector = std::move(src_vector);

src_vector之后不能使用(除了将新内容移动到其中。)它包含的所有元素都已移动到dest_vector中。

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