我试图从一个函数返回一个vector<unique_ptr>
,但是我遇到了错误。我用的是MSVC 19.33.31630
this question的注释建议按值返回,但以下代码:
std::vector<std::unique_ptr<int>> test1()
{
std::vector<std::unique_ptr<int>> ret = { std::make_unique<int>(1) };
return ret;
}
int main()
{
std::vector<std::unique_ptr<int>> x = test1();
std::unique_ptr<int>& ptrY = x.at(0);
return 0;
}
产生此错误:
Error C2280 'std::unique_ptr::unique_ptr(const std::unique_ptr &)':尝试引用已删除的函数
引用返回,如本代码中所示:
std::vector<std::unique_ptr<int>>& test2()
{
std::vector<std::unique_ptr<int>> ret = { std::make_unique<int>(1) };
return ret;
}
int main()
{
std::vector<std::unique_ptr<int>>& y = test2();
std::cout << *(y.at(0)) << std::endl;
return 0;
}
产生同样的错误。
为什么会发生这种情况?unique_ptr
的所有权没有正确转移吗?
发布于 2022-10-21 04:49:40
std::vector<std::unique_ptr<int>> x = test1();
您正在复制test1
在这里返回的向量,而该向量又需要复制其所有内容。默认情况下,赋值操作符=
就是这样做的!只有在复制完成后,test1
的返回值才会超出范围并被销毁。
您正在尝试复制unique_ptr
;无法复制unique_ptr
。所以,这是正确的。
使用std::move
移动向量所持有的值。
更好的是,不要使用赋值运算符,而是直接从返回值构造,这将使用移动构造函数(如果函数按值返回)。
https://stackoverflow.com/questions/74148834
复制相似问题