为什么 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
)。循环尝试复制每个向量元素,因此出现错误。但是,您可以使用对元素的引用来迭代。
我在 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
)。循环尝试复制每个向量元素,因此出现错误。但是,您可以使用对元素的引用来迭代。