【问题标题】:Why does for cycle in vector of unique_ptr require default delete?为什么unique_ptr向量中的循环需要默认删除?
【发布时间】:2022-01-13 11:26:11
【问题描述】:

我在 vs2019 中工作,以下代码运行良好:

std::vector<Foo*> foos;
// fills vector
for (Foo* foo : foos) {
  //do stuff
}

但是,如果我尝试像这样使用unique_ptr

std::vector<std::unique_ptr<Foo>> foos;
// fills vector
for (std::unique_ptr<Foo> foo : foos) {
  //do stuff
}

那么 vs 和编译器都在抱怨(如果我理解正确的话)Foo 没有默认删除。但是在代码库的其他部分使用std::unique_ptr&lt;Foo&gt; 没有问题。

为什么会发生这种情况以及如何解决/避免这种情况?

【问题讨论】:

  • 我可以创建 Foos 的向量并在循环中创建 unique_ptr,但我仍然很困惑为什么会发生这种情况
  • 编译器应该抱怨复制构造函数被删除(也不允许复制unique_ptr)。循环尝试复制每个向量元素,因此出现错误。但是,您可以使用对元素的引用进行迭代
  • for (std::unique_ptr&lt;Foo&gt; foo : foos) {更改为for (std::unique_ptr&lt;Foo&gt;&amp; foo : foos) {
  • 您正在创建 std::unique_ptr 的腼腆,正如名称所示,它应该是唯一的。 for (auto&amp; foo : foos) 将完成这项工作。
  • then both vs and compiler are complaining (if I understand correctly) ... 您应该始终在问题中包含错误消息。

标签: c++ for-loop smart-pointers unique-ptr


【解决方案1】:

尝试改变:

for (std::unique_ptr<Foo> foo : foos)

for (std::unique_ptr<Foo>& foo : foos)

因为正如 @drescherjm 和 @dave 在 cmets 中提到的,编译器应该抱怨复制构造函数被删除(也不允许复制 unique_ptr)。循环尝试复制每个向量元素,因此会出现错误。但是,您可以使用对元素的引用进行迭代。

【讨论】:

    【解决方案2】:

    正如 cmets 提到的,替换 for (std::unique_ptr&lt;Foo&gt; foo : foos)

    for (std::unique_ptr&lt;Foo&gt;&amp; foo : foos) 有效(可能是创建副本的问题(如@dave 所述)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2012-08-02
      • 2015-04-15
      • 2018-07-12
      • 2019-09-18
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多