迭代取消引用的unique_ptr,包含vector,用于范围循环

时间:2017-12-18 14:22:29

标签: c++ c++11 for-loop vector unique-ptr

为什么这段代码不像我想的那样工作?

for (auto it: *std::make_unique<std::vector<int>>(std::vector<int>({1, 2, 3, 4, 5})))
    std::cout << it << std::endl;

在执行循环的第一次迭代

之前,矢量对象被销毁

1 个答案:

答案 0 :(得分:11)

range-based for loop相当于:

{
  init-statement
  auto && __range = range_expression ;
  ... 
} 

对于range_expression,它将是

auto && __range = *std::make_unique<std::vector<int>>(std::vector<int>({1, 2, 3, 4, 5}));

但是

  

如果 range_expression 返回一个临时值,它的生命周期会延长到循环结束,如绑定到右值引用__range所示,但要注意任何临时值的生命周期 range_expression 未扩展。

std::make_unique返回的是一个临时的std::unique_ptr,在完整表达之后它将被销毁。这意味着由它管理的std::vector也将被销毁;即使来自临时std::vector的{​​{1}}绑定到转发引用,其生命周期也不会被延长。

从C ++ 20开始,您可以使用init-statement;比如

std::unique_ptr