【问题标题】:Assign std::vector<std::unique_ptr<T>> to another std::vector<std::unique_ptr<T>>将 std::vector<std::unique_ptr<T>> 分配给另一个 std::vector<std::unique_ptr<T>>
【发布时间】:2019-11-07 14:54:45
【问题描述】:

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

我收到此编译器错误:

/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::vector 级别使用std::move() 代替。 std::unique_ptr 没有 std::vector 的赋值运算符所要求的复制构造函数。
  • @πάνταῥεῖ 谢谢!如果您将此作为答案,我会接受。

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。我要把它交给留下评论的人,因为他们比你快 30 秒!谢谢你的回答。我投了赞成票。
  • @user997112 不用担心 :)
  • @user997112 你可以接受这个答案。我不会去抱怨(也不会写另一个答案)。
  • @user997112 写评论比写答案更容易。 30 秒是不公平的
【解决方案2】:

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

dest_vector = std::move(src_vector);

src_vector 之后就不能使用了(除了将新的东西移入其中)。它包含的所有元素都已移入dest_vector

如果您确实想要副本,请改用shared_ptr。每个副本仍将管理相同的指针,并将跟踪存在多少副本。 只有在所有shared_ptr 副本被销毁后,托管指针才会被删除。

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多