Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Переместить unique_ptr из vector в deque

Необходимо перенести объект типа std::unique_ptr из вектора в дек.
Пример кода
using UPtr = std::unique_ptr;
std::deque d; std::vector v;
for (int i = 0; i < 5; ++i) { v.emplace_back(new int(i)); }
for (const auto& item : v) { d.emplace_front(std::move(item)); }
Но неожиданно возникает ошибка компиляции:
error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete]' { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } ^ In file included from /usr/include/c++/5/memory:81:0, from prog.cpp:4: /usr/include/c++/5/bits/unique_ptr.h:356:7: note: declared here unique_ptr(const unique_ptr&) = delete;
Насколько я понимаю, должен использоваться перемещающий конструктор, а не копирующий, но этого не происходит.


Ответ

Проблема оказалась в квалификаторе const В цикле
for (const auto& item : v) { d.emplace_front(std::move(item)); }
переменная item имеет тип const std::unique_ptr&, соответственно при вызове std::move получаем тип const std::unique_ptr&&. Перемещающего конструктора, который бы принимал этот тип, нет, поэтому компилятор использует копирующий конструктор, что и приводит к ошибке.

Похожая ошибка рассмотрена у Скотта Мейерса в книге "Эффективный и современный C++" в разделе 5.1.

Комментариев нет:

Отправить комментарий