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
值,您应该只构造一个空的 vector
和 push_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
,不需要任何复制。
我想管理一个二维数组如下:
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
值,您应该只构造一个空的 vector
和 push_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
,不需要任何复制。