为什么 for cycle in vector of unique_ptr 需要默认删除?

Why does for cycle in vector of unique_ptr require default delete?

我在 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<Foo> 在代码库的其他部分使用没有问题。

为什么会发生这种情况以及如何fix/circumvent?

如评论所述,替换 for (std::unique_ptr<Foo> foo : foos)

for (std::unique_ptr<Foo>& foo : foos) 有效(创建副本可能有问题(如@dave 所述)。

尝试更改:

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

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

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