在向量

时间:2017-01-12 15:06:53

标签: c++ vector unique-ptr

我尝试在声明期间在向量中移动一些unique_ptr,但是我收到错误。我想我在不知情的情况下制作副本。

我不明白为什么我在声明中遇到问题,而它在push_back期间运行良好。

我在几行中简化了问题。

#include <iostream>
#include <vector>
#include <memory>
using namespace std;

int main() {

    unique_ptr<int> i1 = make_unique<int>(142);
    unique_ptr<int> i2 = make_unique<int>(242);
    unique_ptr<int> i3 = make_unique<int>(342);


    vector<unique_ptr<int>> v;

    //Those lines work
    v.push_back(move(i1));
    v.push_back(move(i2));
    v.push_back(move(i3));

    //ERROR
    vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)}; 

    return 0;
}

错误是:

use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const
std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp =
std::default_delete<int>]'
     { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }

我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:6)

当你这样做时

vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)};

你实际上并没有直接进入向量v2。相反,编译器将创建std::initializer_list移动的唯一指针,并将该列表对象传递给std::vector constructor,然后{...}}将尝试从初始化列表中复制元素。< / p>

不幸的是,我知道无法解决问题,使用中间初始化列表来初始化唯一指针的向量。

答案 1 :(得分:3)

该行

vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)}; 

创建一个std::initializer_list,它只通过reference-to-const提供对其成员的访问。通过从每个initializer_list移动来构造此unique_ptr,但是通过复制initializer_list中的元素来初始化该向量。这个副本会导致编译错误。