首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从函数返回std::vector<std::unique_ptr<T>>

从函数返回std::vector<std::unique_ptr<T>>
EN

Stack Overflow用户
提问于 2022-10-21 04:40:39
回答 2查看 89关注 0票数 1

我试图从一个函数返回一个vector<unique_ptr>,但是我遇到了错误。我用的是MSVC 19.33.31630

this question的注释建议按值返回,但以下代码:

代码语言:javascript
运行
复制
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 &)':尝试引用已删除的函数

引用返回,如本代码中所示:

代码语言:javascript
运行
复制
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的所有权没有正确转移吗?

EN

Stack Overflow用户

发布于 2022-10-21 04:49:40

代码语言:javascript
运行
复制
std::vector<std::unique_ptr<int>> x = test1();

您正在复制test1在这里返回的向量,而该向量又需要复制其所有内容。默认情况下,赋值操作符=就是这样做的!只有在复制完成后,test1的返回值才会超出范围并被销毁。

您正在尝试复制unique_ptr;无法复制unique_ptr。所以,这是正确的。

使用std::move移动向量所持有的值。

更好的是,不要使用赋值运算符,而是直接从返回值构造,这将使用移动构造函数(如果函数按值返回)。

票数 -3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74148834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档