【发布时间】: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<Foo> 没有问题。
为什么会发生这种情况以及如何解决/避免这种情况?
【问题讨论】:
-
我可以创建 Foos 的向量并在循环中创建 unique_ptr,但我仍然很困惑为什么会发生这种情况
-
编译器应该抱怨复制构造函数被删除(也不允许复制
unique_ptr)。循环尝试复制每个向量元素,因此出现错误。但是,您可以使用对元素的引用进行迭代 -
将
for (std::unique_ptr<Foo> foo : foos) {更改为for (std::unique_ptr<Foo>& foo : foos) { -
您正在创建
std::unique_ptr的腼腆,正如名称所示,它应该是唯一的。for (auto& foo : foos)将完成这项工作。 -
then both vs and compiler are complaining (if I understand correctly) ...您应该始终在问题中包含错误消息。
标签: c++ for-loop smart-pointers unique-ptr