带有向量的unique_ptr:错误:xxx的隐式删除复制构造函数



我想管理一个二维数组:

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 :: simelor_ptr&lt;int [],std :: __ 1 :: Default_delete&lt;int []>>'

我相信问题是您的vector构造函数调用( 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(甚至是一个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)
...

要初始化具有一些空值的vector,请省略第二个参数:

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

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

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

此行复制构造5 std::unique_ptr<int []>来自nullptr构建的临时性。这是非法的。

我认为您想要这个:

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));

您将整数元素插入预期的数组。

最新更新