В соответствии с (отличным) вопросом требования к пост-инкременту 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
:
Любые копии предыдущего значения
r
больше не должны быть разыменованными или находиться в домене==
.
Соответствующие разделы: 24.2.2 Итератор, 24.2.4 Итераторы вывода, 17.6.3.1 Требования к аргументам шаблона.
Кроме того, если это не требуется, чтобы быть действительным, существуют ли какие-либо ситуации, когда использование его недопустимости помогло бы в реализации (с точки зрения эффективности, простоты) типа OutputIterator
при соблюдении существующих требований?
ostream_iterator
, который фактически увеличивается только при назначении, игнорируя другие операции увеличения. Однако не похоже, что все OutputIterators должны подчиняться этой семантике. - person nknight   schedule 09.08.2012