#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.
Комментариев нет:
Отправить комментарий