Страницы

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

суббота, 21 декабря 2019 г.

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

#cpp #cpp11


Необходимо перенести объект типа 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;


Насколько я понимаю, должен использоваться перемещающий конструктор, а не копирующий,
но этого не происходит.
    


Ответы

Ответ 1



Проблема оказалась в квалификаторе 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.

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

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