为什么这段代码不像我想的那样工作?
for (auto it: *std::make_unique<std::vector<int>>(std::vector<int>({1, 2, 3, 4, 5})))
std::cout << it << std::endl;
在执行循环的第一次迭代
之前,矢量对象被销毁答案 0 :(得分:11)
{
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