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

Dan*_*iil 9 c++ for-loop vector unique-ptr c++11

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

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

在执行循环的第一次迭代之前,矢量对象被销毁

son*_*yao 11

基于范围的for循环等效于:

{
  init-statement
  auto && __range = range_expression ;
  ... 
} 
Run Code Online (Sandbox Code Playgroud)

对于你的range_expression,它会是

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

如果range_expression返回临时值,则其生存期将延长到循环结束,如绑定到右值引用所示__range,但要注意range_expression中任何临时值的生命周期都不会延长.

什么std::make_unique返回是临时的std::unique_ptr,在完整表达之后它将被销毁.这意味着std::vector由它管理的也将被销毁; 即使std::vector从临时获得的std::unique_ptr绑定到转发引用,其生命周期也不会被延长.

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

for (auto p = std::make_unique<std::vector<int>>(std::vector<int>({1, 2, 3, 4, 5})); auto it : *p)
    std::cout << it << std::endl;
Run Code Online (Sandbox Code Playgroud)