Dereferenzierung zu einem doppelt inkrementierten OutputIterator

Per die (ausgezeichnete) FrageAnforderungen nach dem Inkrementieren von C ++ OutputIteratorbeobachten wir, dass für einen dereferenzierbaren und inkrementierbaren Wertr vonOutputIterator ArtXund Werto von geeigneter Art ist der Ausdruck

*r++ = o;

ist gültig und hat äquivalente Semantik zu

X a(r);
++r;
*a = o;

Ist es aber immer noch so?a ist dereferenzierbar wennr wurde in der Zwischenzeit mehrmals erhöht; Ist dieser Code also gültig?

X a(r);
++r;
++r;
*a = o;

Es ist schwer zu erkennen, wie Operationen an einem Wert die Gültigkeit von Operationen an einem anderen Wert beeinflussen können, z.InputIterator (24.2.3) hat unter den Nachbedingungen von++r:

Alle Kopien des vorherigen Werts vonr müssen weder dereferenzierbar noch in der Domäne von sein==.

Relevante Abschnitte:24.2.2 Iterator, 24.2.4 Ausgabe-Iteratoren, 17.6.3.1 Anforderungen an Vorlagenargumente.

Auch wenn das so istnicht erforderlich, um gültig zu sein, gibt es Situationen, in denen die Ausnutzung seiner Nichtgültigkeit bei der Implementierung (mit Effizienz, Einfachheit) einesOutputIterator eingeben und dabei noch die bestehenden anforderungen beachten?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage