Вставка вектора unique_ptr в другой вектор - программирование
Подтвердить что ты не робот

Вставка вектора unique_ptr в другой вектор

У меня есть вектор unique_ptr, и я хочу добавить их к другому вектору unique_ptrs. Обычно я делаю простую вставку:

std::vector<std::unique_ptr<foo>> bar;
bar.push_back(std::unique_ptr<foo>(new foo(1)));
std::vector<std::unique_ptr<foo>> baz;
baz.push_back(std::unique_ptr<foo>(new foo(2)));
bar.insert(bar.end(), baz.begin(), baz.end());

Однако это дает мне скомпилировать ошибки, подобные этому:

/usr/include/c++/4.8/bits/stl_algobase.h:335: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = foo; _Dp = std::default_delete<foo>]'
    *__result = *__first;
              ^

Есть ли удобный способ вставить или сделать, чтобы я перебирал baz и push_back на панели? В настоящее время я использую gcc 4.8.1.

Спасибо

4b9b3361

Ответ 1

unique_ptr не присваивается стандартным оператором присваивания (ошибка говорит об удалении). Вы можете перемещать их только:

bar.insert(bar.end(),
    std::make_move_iterator(baz.begin()),
    std::make_move_iterator(baz.end())
);

Конечно, это переносит право собственности на управляемый объект, а исходные указатели будут иметь значение nullptr.

Ответ 2

Вы не можете их скопировать; вам придется переместить их.

std::move(baz.begin(), baz.end(), std::back_inserter(bar));