如何将unique_ptr的向量声明为类数据成员?

Bre*_*hns 9 c++ vector visual-studio-2010 unique-ptr

我想有一个unique_ptr的向量作为我正在制作的类的成员.

class Foo {
    [...]

private:
    vector<unique_ptr<Bar>> barList;
}
Run Code Online (Sandbox Code Playgroud)

但后来我开始从VS2010编译器获取神秘的错误消息:

error C2248: 'std::unique_ptr<_Ty>::operator =' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Run Code Online (Sandbox Code Playgroud)

除了下面的一些错误行,这些错误行将深入到微软的实施std::_Copy_impl<>......

我将成员声明更改为

vector<unique_ptr<Bar>>* barList;
Run Code Online (Sandbox Code Playgroud)

它编译.但我不禁想知道为什么我不能按照我原来想要的方式去做?为了笑容,我尝试了这个,它工作正常:

vector<Bar> barList;
Run Code Online (Sandbox Code Playgroud)

但现在我失去了方便unique_ptr.我想要我的蛋糕,我也想吃它!

Man*_*rse 12

这里的问题是,在某处,您的代码试图调用"复制赋值"运算符Foo.

这会导致编译器尝试生成一个复制赋值运算符,该运算符调用所有子对象的复制赋值运算符Foo.最终,这导致尝试复制一个unique_ptr不可能的操作.


Mar*_*k B 5

unique_ptr没有复制语义,因此您不能使用任何复制包含对象的方法.您可以通过std::move在试图复制的地方使用rvalue引用执行此操作.没有看到你的代码,我不能说那将是什么.

如果它以第二种形式编译,要么你没有运用相同的代码,要么存在编译器错误.两者都应该以同样的方式失败.

您的第三个示例,按值存储是最简单的方法,除非您的对象很大并且价值昂贵,可以按值存储/复制.