Стандарт требует, чтобы *r++ = t
работал для выходных итераторов (24.1.2).Если это не работает, это не выходной итератор по определению стандарта.
Именно реализация итератора должна гарантировать, что такие операторы работают должным образом.
Причина, по которой вы не должны хранить несколько копий выходного итератора, состоит в том, что он имеет один проходсемантика.Итератор может быть разыменован только один раз для каждого значения (то есть он должен увеличиваться между каждой операцией разыменования).После разыменования итератора его копия не может быть.
Именно поэтому *r++ = t
работает.Копия сделана из исходного итератора, исходный итератор разыменован, и копия увеличивается.Исходный итератор больше никогда не будет использоваться, и копия больше не ссылается на то же значение.