我尝试用 unique_ptr 构造一个 vector 。但是我没有找到直接的方法。以下代码无法编译。错误是:调用“std::__1::unique_ptr >”的隐式删除的复制构造函数:
#include <iostream>
#include <memory>
#include <utility>
#include <vector>
class test1{
public:
test1(){};
test1(test1&&)=default;
};
int main(int argc, const char * argv[]) {
std::unique_ptr<test1> us(new test1());
std::vector<std::unique_ptr<test1>> vec{move(us)};
return 0;
}
最佳答案
您正在调用 vector
constructor (链接页面上的(7))需要initializer_list<T>
争论。一个initializer_list
only allows const
access到它的元素,所以vector
必须复制元素,这当然无法编译。
以下应该有效
std::unique_ptr<test1> us(new test1());
std::vector<std::unique_ptr<test1>> vec;
vec.push_back(move(us));
// or
vec.push_back(std::unique_ptr<test1>(new test1()));
// or
vec.push_back(std::make_unique<test1>()); // make_unique requires C++14
您可以使用 vector
采用两个迭代器的构造函数,但解决方案仍然不是单行的,因为它需要您定义一个临时数组,然后您可以从中移动。
std::unique_ptr<test1> arr[] = {std::make_unique<test1>()};
std::vector<std::unique_ptr<test1>> vec{std::make_move_iterator(std::begin(arr)),
std::make_move_iterator(std::end(arr))};
关于c++ - 如何构造具有唯一指针的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972563/