Per die (ausgezeichnet) Frage C++ OutputIterator post-increment requirements beobachten wir, dass für einen dereferenceable und inkrementierbare Wert r
von OutputIterator
Typ X
und Wert o
geeigneter Art, die Expressiondereferenzieren-Zuordnung zu einem zweifach erhöht OutputIterator
*r++ = o;
jedoch ist gültig und äquivalente Semantik
X a(r);
++r;
*a = o;
hat, ist es immer noch der Fall ist, die a
dereferenzieren zuweisbare wenn r
in der Zwischenzeit mehr als einmal inkrementiert wurde; Das heißt, ist dieser Code gültig?
Es ist schwierig zu sehen, wie Operationen auf einen Wert sich auf die Gültigkeit von Operationen auf einem anderen Wert auswirken können, aber z. InputIterator
(24.2.3) hat, unter den Nachbedingungen von ++r
:
Alle Kopien des vorherigen Wertes von
r
keine länger sind entweder erforderlich die Domäne von==
in dereferenceable oder sein wird.
Relevante Abschnitte: 24.2.2 Iterator, 24.2.4 Output Iteratoren, 17.6.3.1 Vorlage Argument Anforderungen.
Auch wenn diese nicht ist erforderlich um gültig zu sein, gibt es Situationen, in denen seine Nicht-Gültigkeit ausnutzen würde bei der Umsetzung unterstützen (w.r.t. Effizienz, Einfachheit) einen OutputIterator
Typs, während immer noch die bestehenden Anforderungen zu beobachten?
SGI STL (http://www.sgi.com/tech/stl/OutputIterator.html Fußnote 3) verbietet explizit dieses Verhalten und zwingt eine Folge abwechselnder Inkremente und Dereferenzierungszuweisungen; Diese Anforderung kann ich jedoch nicht aus dem C++ - Standard ableiten. Bedeutet '* nur einmal *' in [24.2.4: 2] genau einmal oder höchstens einmal? – nknight
Diese Antwort: (http://StackOverflow.com/A/4004035/985943) lässt mich denken, dass dieses Verhalten für einen 'ostream_iterator' gültig ist, der nur tatsächlich bei Zuweisung erhöht, andere Inkrementierungsvorgänge ignorierend. Es scheint jedoch nicht, dass alle OutputIterators diese Semantik befolgen müssen. – nknight
@nknight sehr interessant. * nur einmal * erscheint 5 mal im Standard, 3,4: 1 mit einer anderen Bedeutung und bei 5,17: 7, 12,8: 15, 29,6,5: 8 im Sinne * höchstens einmal (aber meist einmal) *. * genau einmal * und * höchstens einmal * jeweils 5 mal erscheinen. Sicher, wenn der Standard die SGI-Beschränkungen vorsieht, hätten sie diese Sprache integriert? – ecatmur