unique_ptr with vector: error: call to implicitly-deleted copy constructor of XXX

unique_ptr with vector: error: call to implicitly-deleted copy constructor of XXX

我想管理一个二维数组如下:

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

但是我得到一个错误:

error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr< int [], std::__1::default_delete< int []> >'

您要在预期的数组位置插入整数元素。

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

此行从 nullptr 构造的临时复制构造 5 std::unique_ptr<int []>。这是违法的。

我想你想要这个:

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

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

std::vector<std::unique_ptr<int []>> vec(5);
vec[0] = std::make_unique<int []>(std::size_t(3));

我认为问题出在您的 vector constructor call (2: fill constructor):

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

在这里,您实际上是在调用 vector(size_t(5), std::unique_ptr<int[]>(nullptr))。请注意,这会创建 std::unique_ptr 的临时实例,隐含地从您的 nullptr 参数中 converted/constructed。然后 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,不需要任何复制。