distance
на входном итераторе будет повторно вызывать operator++
.Однако эта операция делает недействительными все копии итератора, поскольку все они ссылаются на один и тот же базовый поток
Это логично: рассмотрим, что представляет итератор: текущее состояние входного потока.Как только вы добавите итератор, это состояние изменится.Поэтому все другие итераторы, представляющие старое состояние, теперь ссылаются на состояние, которого больше нет.
Вот почему вы видите это поведение.
Более того, получение расстояния от двух потоковых операторов не являетсязначимая операция, поскольку потоки не имеют фиксированной длины : потоки представляют переходное состояние.