将 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
定义移动分配操作员?该类仅包含几个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
副本都已破坏,托管指针将仅被删除。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中