Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: LegacyForwardIterator

Von cppreference.com
 
 
C++ benannte Anforderungen
 

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.

  • X erfüllt LegacyInputIterator.
  • X erfüllt DefaultConstructible.
  • Wenn X ein mutable Iterator ist, ist Ref eine Referenz auf T.
  • Wenn X ein konstanter Iterator ist, ist Ref eine Referenz auf const T.
  • Objekte vom Typ X bieten 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
  • X ist ein Zeigertyp.
  • Der Ausdruck (void)++X(a), *a ist äquivalent zum Ausdruck *a.

Konzept

Für die Definition von std::iterator_traits wird das folgende exposition-only-Konzept definiert.

template<class It>

concept __LegacyForwardIterator =
    __LegacyInputIterator<It> && std::constructible_from<It> &&
    std::is_reference_v<std::iter_reference_t<It>> &&
    std::same_as<
        std::remove_cvref_t<std::iter_reference_t<It>>,
        typename std::indirectly_readable_traits<It>::value_type> &&
    requires(It it) {
        {  it++ } -> std::convertible_to<const It&>;
        { *it++ } -> std::same_as<std::iter_reference_t<It>>;

    };

wobei das exposition-only-Konzept __LegacyInputIterator<T> in LegacyInputIterator beschrieben ist.

(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 erforderte
std::iter_reference_t<It> als lvalue-Referenztyp
erlaubt auch rvalue
Referenztypen
  1. 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.
  2. Formell wird auch impliziert, dass ++b != a.

[bearbeiten] Siehe auch

spezifiziert, dass ein input_iterator ein Vorwärtsiterator ist, der Gleichheitsvergleich und Multi-Pass unterstützt
(Konzept) [bearbeiten]
Iterator-Bibliothek stellt Definitionen für Iteratoren, Iterator-Traits, Adaptoren und Hilfsfunktionen bereit