Per the (excellent) question C++ OutputIterator post-increment requirements, we observe that for a dereferenceable and incrementable value r of OutputIterator type X, and value o of appropriate type, the expression
*r++ = o;
is valid and has equivalent semantics to
X a(r);
++r;
*a = o;
However, is it still the case the a is dereference-assignable if r has been incremented more than once in the intervening period; that is, is this code valid?
X a(r);
++r;
++r;
*a = o;
It's difficult to see how operations on a value can have an effect on the validity of operations on another value, but e.g. InputIterator (24.2.3) has, under the postconditions of ++r:
Any copies of the previous value of
rare no longer required either to be dereferenceable or to be in the domain of==.
Relevant sections: 24.2.2 Iterator, 24.2.4 Output iterators, 17.6.3.1 Template argument requirements.
Also, if this is not required to be valid, are there any situations where exploiting its non-validity would aid in the implementation (w.r.t. efficiency, simplicity) of an OutputIterator type while still observing the existing requirements?