带向量的unique_ptr:错误:调用XXX的隐式删除的复制构造函数

时间:2016-11-30 01:02:49

标签: c++ c++11 vector unique-ptr

我想管理如下的二维数组:

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

但是我收到了一个错误:

  

错误:调用'std :: __ 1 :: unique_ptr&lt;的隐式删除的复制构造函数int [],std :: __ 1 :: default_delete&lt; int []&gt; &GT;'

3 个答案:

答案 0 :(得分:5)

我认为问题出在您的vector constructor call 2:填充构造函数)上:

std::vector<std::unique_ptr<int []>> vec(5, nullptr);

在这里,您实际上是在呼叫vector(size_t(5), std::unique_ptr<int[]>(nullptr))。请注意,这将创建std::unique_ptr的临时实例,从nullptr参数隐式转换/构造。然后,vector构造函数应该将您传递给它的值复制n次以填充容器;因为你不能复制任何unique_ptr(即使是空的),你会从构造函数的代码中得到编译器错误。

如果您立即替换这些初始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)
...

要使用一定数量的空值初始化vector,请省略第二个参数:

std::vector<std::unique_ptr<int []>> vec(5);

这将使用default constructor构建每个unique_ptr,不需要任何复制。

答案 1 :(得分:2)

KEY_COUNTY

此行复制构造5 std::vector<std::unique_ptr<int []>> vec(5, nullptr); 来自std::unique_ptr<int []>构建的临时构造。这是非法的。

我想你想要这个:

nullptr

如果你真的想要一个带有5个nullptr的向量,这就是解决方案:

std::vector<std::unique_ptr<int []>> vec;
vec.reserve(5);
vec.push_back(std::make_unique<int []>(std::size_t(3)));

答案 2 :(得分:-2)

您正在插入期望数组的整数元素。