迭代包含向量的解除引用unique_ptr,用于范围循环

为什么不按照我的假设工作?迭代包含向量的解除引用unique_ptr,用于范围循环

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

std::cout << it << std::endl;

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

回答:

的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::unique_ptr获得的std::vector绑定到转发参考,其生存期也不会延长。

从C++ 20开始,你可能会使用init语句;如

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;

以上是 迭代包含向量的解除引用unique_ptr,用于范围循环 的全部内容, 来源链接: utcz.com/qa/264125.html

回到顶部