c++ - 如何构造具有唯一指针的 vector

标签 c++ c++11 unique-ptr initializer-list list-initialization

我尝试用 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/

相关文章:

c++ - 可以删除(或默认)非特殊 C++ 成员函数吗?

C++ - 问题未定义对 PCM::getInstance() 的引用

c++ - push_back vs emplace_back

使用 std::unique_ptr 的 C++ Pimpl Idiom 不完整类型

c++ - 在将 unique_ptr 移入我的基类构造函数之前,如何从 unique_ptr 中提取原始指针

c++ - QListView项目具有复选框选择行为

c++ - 使用两个不同的管道c++以相同的进程读取和写入

c++11 - std::weak_ptr 什么时候有用?

c++ - Netbeans 7.2 中无法识别的命令行选项 "-std=c++11"c++

c++ - 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr