Daily bit(e) C++. std::move_iterator
Добавлено 24 июля 2026 в 20:50
Daily bit(e) C++ 43, адаптер итератора, который разыменовывает в r-значение: std::move_iterator.

Эффективное перемещение данных (до C++23) при работе с гетерогенными контейнерами может быть сложной задачей, поскольку конструкторы перемещения и присваивание перемещением поддерживаются только контейнерами одного типа.
Одним из жизнеспособных вариантов является использование std::move_iterator и конструктора итератора, что приведет к поэлементному перемещению между контейнерами разных типов или с несовпадающими аллокаторами памяти.
std::move_iterator работает точно так же, как и базовый итератор, за исключением того, что при разыменовании он возвращает r-значение.
#include <vector>
#include <list>
#include <iterator>
#include <memory>
struct MyClass {};
std::vector<std::unique_ptr<MyClass>> get_elements();
std::vector<std::unique_ptr<MyClass>> src = get_elements();
// Не скомпилируется: несовместимый тип
std::list<std::unique_ptr<MyClass>> err1(std::move(src));
// Не скомпилируется: std::unique_ptr не копируемый
std::list<std::unique_ptr<MyClass>> err2(src.begin(), src.end());
// OK
std::list<std::unique_ptr<MyClass>> dst(
std::move_iterator(src.begin()),
std::move_iterator(src.end())
);
