Разыменование-присваивание дважды увеличенному OutputIterator
На (отличный) вопросТребования к постинкрементному расширению C ++ OutputIteratorмы видим, что для разыменованного и увеличиваемого значенияr
изOutputIterator
типX
и значениеo
соответствующего типа, выражение
*r++ = o;
допустимо и имеет эквивалентную семантику
X a(r);
++r;
*a = o;
Тем не менее, это все еще такa
присваивается разыменование, еслиr
был увеличен более одного раза за прошедший период; то есть этот код действителен?
X a(r);
++r;
++r;
*a = o;
Трудно увидеть, как операции над значением могут влиять на достоверность операций над другим значением, но, например,InputIterator
(24.2.3), в соответствии с постусловиями++r
:
Any copies of the
previous value of r
are no
longer required either to be
dereferenceable or to be in
the domain of ==
.
Соответствующие разделы:24.2.2 Iterator, 24.2.4 Output iterators, 17.6.3.1 Template argument requirements.
Кроме того, если этоnot должны быть действительными, есть ли ситуации, в которых использование недействительности помогло бы реализовать (с точки зрения эффективности, простоты)OutputIterator
типа пока соблюдаете существующие требования?