Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: LegacyInputIterator

Von cppreference.com
 
 
C++ benannte Anforderungen
 

Ein LegacyInputIterator ist ein LegacyIterator, der aus dem angesteuerten Element lesen kann. LegacyInputIterators garantieren Gültigkeit nur für Algorithmen mit einem Durchlauf: Sobald ein LegacyInputIterator i inkrementiert wurde, können alle Kopien seines vorherigen Wertes ungültig werden.

Inhalt

[bearbeiten] Anforderungen

Typ Definition
X Ein Eingabeiterator-Typ
T Der Werttyp von X (d.h. std::iterator_traits<X>::value_type)
R std::iterator_traits<X>::reference
Wert Definition
i, j Werte vom Typ X oder const X
r Ein Wert vom Typ X&
Sonstiges Definition
m Ein Bezeichner, der möglicherweise ein Datenmember oder eine Memberfunktion bezeichnet


X erfüllt LegacyInputIterator, wenn alle folgenden Bedingungen erfüllt sind

 Ausdruck  Typ Semantik
i != j
ein Typ, der BooleanTestable erfüllt (bis C++20)
ein Typ, der boolean-testable modelliert (seit C++20)
Vorbedingung i und j liegen in der Domäne von ==.
Auswirkung Äquivalent zu !(i == j).
*i konvertierbar nach T Vorbedingung i ist dereferenzierbar.
Auswirkung
  • Der Ausdruck (void)*i, *i ist äquivalent zu *i.
  • Wenn i und j in der Domäne von == liegen und i == j, dann ist *i äquivalent zu *j.
i->m Vorbedingung i ist dereferenzierbar.
Auswirkung Äquivalent zu (*i).m.
++r X& Vorbedingung r ist dereferenzierbar.
Nachbedingung 
  • r ist dereferenzierbar oder r ist nach dem Ende.
  • Alle Kopien des vorherigen Wertes von r müssen nicht mehr als dereferenzierbar oder in der Domäne von == befindlich gelten.
(void)r++ Auswirkung Äquivalent zu (void)++r.
*r++ konvertierbar nach T Auswirkung Äquivalent zu T x = *r; ++r; return x;.

[bearbeiten] Gleichheitsdomäne

Der Begriff die Domäne von == wird im gewöhnlichen mathematischen Sinne verwendet, um die Menge der Werte zu bezeichnen, die mit == verglichen werden können. Diese Menge kann sich im Laufe der Zeit ändern.

Jeder Algorithmus stellt zusätzliche Anforderungen an die Gleichheitsdomäne für die von ihm verwendeten Iteratorwerte. Diese Anforderungen können aus der Verwendung von == und != durch den Algorithmus abgeleitet werden.

[bearbeiten] Hinweise

Für einen Eingabeiterator X, der kein LegacyForwardIterator ist, muss std::iterator_traits<X>::reference kein Referenztyp sein: Das Dereferenzieren eines Eingabeiterators kann ein Proxy-Objekt oder std::iterator_traits<X>::value_type selbst per Wert zurückgeben (wie im Fall von std::istreambuf_iterator).

Konzept

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

template<class I>

concept __LegacyInputIterator =
__LegacyIterator<I> && std::equality_comparable<I> && requires(I i)
{
    typename std::incrementable_traits<I>::difference_type;
    typename std::indirectly_readable_traits<I>::value_type;
    typename std::common_reference_t<std::iter_reference_t<I>&&,
                                     typename std::indirectly_readable_traits<I>::value_type&>;
    *i++;
    typename std::common_reference_t<decltype(*i++)&&,
                                     typename std::indirectly_readable_traits<I>::value_type&>;
    requires std::signed_integral<typename std::incrementable_traits<I>::difference_type>;

};

wobei das expositions-nur-Konzept __LegacyIterator in LegacyIterator beschrieben ist.

(seit C++20)

[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 98 C++98 der Rückgabetyp von *i++ war erforderlich, um T zu sein er kann jeder Typ sein, der nach T konvertierbar ist
LWG 2114
(P2167R3)
C++98 die Konvertierbarkeit nach bool war zu schwach, um
die Erwartungen der Implementierungen widerzuspiegeln
Anforderungen verstärkt

[bearbeiten] Siehe auch

spezifiziert, dass ein Typ ein Eingabeiterator ist, d. h. seine referenzierten Werte können gelesen werden und er kann sowohl prä- als auch post-inkrementiert werden
(Konzept) [bearbeiten]
Iterator-Bibliothek stellt Definitionen für Iteratoren, Iterator-Traits, Adaptoren und Hilfsfunktionen bereit