C++ benannte Anforderungen: LegacyForwardIterator
Ein LegacyForwardIterator ist ein LegacyIterator, der Daten aus dem auf das Element verweisenden Element lesen kann.
Im Gegensatz zu LegacyInputIterator und LegacyOutputIterator kann er in Mehrpass-Algorithmen verwendet werden.
Wenn ein LegacyForwardIterator it von einem Container stammt, dann ist der Werttyp von it derselbe wie der des Containers, sodass das Dereferenzieren (*it) den Werttyp des Containers erhält.
Inhalt |
[bearbeiten] Anforderungen
| Typ | Definition |
X
|
Ein Forward-Iterator-Typ |
T
|
Der Werttyp von X (d.h. std::iterator_traits<X>::value_type) |
Ref
|
std::iterator_traits<X>::reference |
| Wert | Definition |
| i, j | Werte vom Typ X oder const X |
| r | Ein Wert vom Typ X& |
X erfüllt LegacyForwardIterator, wenn alle folgenden Bedingungen erfüllt sind.
-
Xerfüllt LegacyInputIterator. -
Xerfüllt DefaultConstructible. - Wenn
Xein mutable Iterator ist, istRefeine Referenz aufT. - Wenn
Xein konstanter Iterator ist, istRefeine Referenz auf const T. - Objekte vom Typ
Xbieten eine Mehrpass-Garantie. - Wenn i und j gleich sind, dann sind entweder i und j beide dereferenzierbar oder keiner von beiden ist dereferenzierbar.
- Wenn i und j beide dereferenzierbar sind, dann ist i == j genau dann, wenn *i und *j an dasselbe Objekt gebunden sind.
- Die folgenden Ausdrücke müssen gültig sein und ihre angegebenen Effekte haben
| Ausdruck | Typ | Effekte |
|---|---|---|
| r++ | konvertierbar zu const X& | Äquivalent zu X x = r; ++r; return x;. |
| *i++ | Ref
|
[bearbeiten] Gleichheitsdomäne
Die Domäne von == für Forward-Iteratoren ist die der Iteratoren über dieselbe zugrundeliegende Sequenz.
|
Allerdings können wertinitialisierte Forward-Iteratoren verglichen werden und müssen gleich anderen wertinitialisierten Iteratoren desselben Typs sein. Mit anderen Worten, wertinitialisierte Forward-Iteratoren verhalten sich so, als ob sie hinter dem Ende derselben leeren Sequenz verweisen würden. |
(seit C++14) |
[bearbeiten] Mehrpass-Garantie
Zwei dereferenzierbare Iteratoren a und b vom Typ X bieten die Mehrpass-Garantie, wenn alle folgenden Bedingungen erfüllt sind.
- a == b impliziert ++a == ++b.
- Eine der folgenden Bedingungen ist erfüllt
-
Xist ein Zeigertyp. - Der Ausdruck (void)++X(a), *a ist äquivalent zum Ausdruck *a.
-
KonzeptFür die Definition von std::iterator_traits wird das folgende exposition-only-Konzept definiert.
wobei das exposition-only-Konzept |
(seit C++20) |
[bearbeiten] Hinweise
Im Gegensatz zum std::forward_iterator-Konzept erfordern die LegacyForwardIterator-Anforderungen, dass die Dereferenzierung eine Referenz zurückgibt.
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 1212 (N3066) |
C++98 | Der Typ von *i++ stimmte nicht mit dem Typ von *i-- überein, wie von LegacyBidirectionalIterator gefordert |
geändert zum Typ Ref |
| LWG 1311 (N3066) |
C++98 | „a == b impliziert ++a == ++b“ allein bot keine Mehrpass-Garantie[1] |
fordert auch „a == b impliziert ++a != b“[2] |
| LWG 3798 | C++20 | __LegacyForwardIterator erfordertestd::iter_reference_t<It> als lvalue-Referenztyp |
erlaubt auch rvalue Referenztypen |
- ↑ In dem Szenario, in dem a und b denselben zugrundeliegenden Iterator verwenden, erhöht die Auswertung des Ausdrucks ++a == ++b tatsächlich den zugrundeliegenden Container zweimal, aber das Ergebnis ist immer noch true.
- ↑ Formell wird auch impliziert, dass ++b != a.
[bearbeiten] Siehe auch
| (C++20) |
spezifiziert, dass ein input_iterator ein Vorwärtsiterator ist, der Gleichheitsvergleich und Multi-Pass unterstützt(Konzept) |
| Iterator-Bibliothek | stellt Definitionen für Iteratoren, Iterator-Traits, Adaptoren und Hilfsfunktionen bereit |