【问题标题】:How to initialize a vector of a structure with unique_ptr? [duplicate]如何使用 unique_ptr 初始化结构的向量? [复制]
【发布时间】:2014-05-14 13:25:43
【问题描述】:

如何用 unique_ptr 初始化结构的向量?例如:

#include <memory>
#include <vector>

using namespace std;

struct A
{
    int i;
    unique_ptr<int> p;
};

int main()
{
    vector<A> v{ { 10, make_unique<int>(10) } };
    // error above: cannot convert from initializer-list to vector<A>

    return 0;
}

【问题讨论】:

    标签: c++ c++11 initialization


    【解决方案1】:
    vector<A> v{ { 10, make_unique<int>(10) } };
    

    在上面语句的内括号中,您正在聚合初始化A 的实例,到目前为止一切顺利。

    但是现在没有办法这个实例移出初始化列表,你唯一能做的就是复制这个对象。但是,复制将失败,因为A 的编译器生成的复制构造函数由于unique_ptr 数据成员而被隐式删除。因此编译错误。

    解决这个问题的唯一方法是不使用花括号初始化列表。而是构造一个A 的实例,然后使用

    v.push_back(std::move(a));
    

    【讨论】:

    • 或者您可以为 A 创建一个复制构造函数。
    • @AndyG 当然,但是您如何在复制构造函数中处理unique_ptr?复制所指向的对象似乎有点奇怪,但你可以这样做。
    • 是的,通过复制。在 OP 的情况下,我们只是复制一个 int。
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多