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)