Если я правильно понимаю, a=std::move(b)
связывает ссылку a с адресом b. И после этой операции контент, на который указывает b, не гарантируется.
Реализация move_iterator
здесь имеет эту строку
auto operator[](difference_type n) const -> decltype(std::move(current[n]))
{ return std::move(current[n]); }
Однако, я не думаю, что имеет смысл std::move
элемент в массиве. Что произойдет, если a=std::move(b[n])
?
Следующий пример меня смущает:
std::string concat = std::accumulate(
std::move_iterator<iter_t>(source.begin()),
std::move_iterator<iter_t>(source.end()),
std::string("1234"));
Поскольку concat
сам будет выделять непрерывный кусок памяти для хранения результата, который не будет перекрываться с source
. Данные в source
будут скопированы на concat
, но не будут перемещены.