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
r
are 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?
ostream_iterator
, which only actually increments on assignment, ignoring other increment operations. However, it doesn't seem all OutputIterators must obey those semantics. – Mitran