Given an output iterator it, the expression *it++ makes a copy of it, increments it, and then returns the copy which is finally dereferenced

The important notions needed to understand are as follows:

  • The standard requires that *it++ = t work for output iterators
  • Output iterators are single pass iterators, which means that the iterator can only be dereferenced once at each value (or, alternatively, that it has to be incremented between each dereference operation)

Hence, having two copies at a time is fine as long as you only dereference one of them (and only once).