【发布时间】:2018-05-31 21:54:07
【问题描述】:
为什么这段代码没有像我想象的那样工作?
for (auto it: *std::make_unique<std::vector<int>>(std::vector<int>({1, 2, 3, 4, 5})))
std::cout << it << std::endl;
向量对象在执行循环的第一次迭代之前被销毁
【问题讨论】:
-
请注意,C++20 允许通过“带有初始化程序的基于范围的语句”来避免这种陷阱,如下所述:herbsutter.com/2017/11/11/…。也就是说:您将单独声明
unique_ptr,确保它在整个循环中都存在,然后使用它的取消引用作为迭代的范围。 -
为什么不直接写
for (auto it: {1, 2, 3, 4, 5})呢?对于更复杂的情况,为什么要使用std::unique_ptr<std::vector<T>>而不是std::vector<T>。 -
是的,这是一个非常人为的例子,它展示了问题区域,但有点夸张。 :)
标签: c++ c++11 for-loop vector unique-ptr