带矢量的unique_ptr:错误:调用XXX的隐式删除副本构造函数

Yve*_*ves 2 c++ vector unique-ptr c++11

我要管理一个二维数组,如下所示:

std::vector<std::unique_ptr<int []>> vec(5, nullptr);
vec[0] = std::make_unique<int []>(3);
vec[1] = std::make_unique<int []>(4);
...
Run Code Online (Sandbox Code Playgroud)

但是我得到一个错误:

错误:调用“ std :: __ 1 :: unique_ptr <int [],std :: __ 1 :: default_delete <int []>>”的隐式删除副本构造函数

qxz*_*qxz 6

我相信问题在于您的vector构造函数调用2:填充构造函数):

std::vector<std::unique_ptr<int []>> vec(5, nullptr);
Run Code Online (Sandbox Code Playgroud)

在这里,您实质上是在打电话vector(size_t(5), std::unique_ptr<int[]>(nullptr))。请注意,这会创建一个临时实例std::unique_ptr,从您的nullptr参数隐式转换/构造。然后,vector构造函数应复制您传递给它的该值,n以填充容器;由于您无法复制任何内容unique_ptr(甚至是null),因此会从该构造函数的代码中得到编译器错误。

如果你立即更换那些初始nullptr值,你应该建立一个空的vectorpush_back新的元素:

std::vector<std::unique_ptr<int []>> vec; // default constructor
vec.push_back(std::make_unique<int []>(3)); // push the elements (only uses the move
vec.push_back(std::make_unique<int []>(4)); // constructor of the temporary)
...
Run Code Online (Sandbox Code Playgroud)

vector使用一些空值初始化a ,请省略第二个参数:

std::vector<std::unique_ptr<int []>> vec(5);
Run Code Online (Sandbox Code Playgroud)

这将unique_ptr使用默认构造函数构造每个对象,而不需要任何复制。