我有一个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,一个集合和几个基元。没有指针成员。
答案 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
副本都被销毁,托管指针将仅被删除。