Если я правильно понимаю, 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, но не будут перемещены.