迭代包含向量的解除引用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