Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: LegacyBidirectionalIterator

Von cppreference.com
 
 
C++ benannte Anforderungen
 

Ein LegacyBidirectionalIterator ist ein LegacyForwardIterator, der in beide Richtungen bewegt werden kann (d.h. inkrementiert und dekrementiert).

Wenn ein LegacyBidirectionalIterator it von einem Container stammt, dann ist der value_type von it derselbe wie der des Containers, sodass Dereferenzierung (*it) den value_type des Containers ergibt.

Inhalt

[bearbeiten] Anforderungen

Der Typ It erfüllt LegacyBidirectionalIterator, wenn

Und, gegeben

  • a und b, lvalues vom Typ It
  • reference, der Typ, der durch std::iterator_traits<It>::reference bezeichnet wird

Die folgenden Ausdrücke müssen gültig sein und ihre angegebenen Effekte haben

Ausdruck Rückgabe Äquivalenter Ausdruck Anmerkungen
--a It& Vorbedingungen
  • a dekrementierbar ist (es existiert ein solches b, dass a == ++b)

Nachbedingungen

  • a ist dereferenzierbar
  • --(++a) == a
  • Wenn --a == --b, dann ist a == b
  • a und --a bezeichnen dasselbe Iteratorobjekt
a-- konvertierbar zu const It& It temp = a;

--a;

return temp;
*a-- Referenz

Ein mutable LegacyBidirectionalIterator ist ein LegacyBidirectionalIterator, der zusätzlich die Anforderungen an LegacyOutputIterator erfüllt.

[bearbeiten] Anmerkungen

Der Begin-Iterator ist nicht dekrementierbar und das Verhalten ist undefiniert, wenn --container.begin() ausgewertet wird.

Ein bidirektionaler Iterator muss nicht dereferenzierbar sein, um dekrementierbar zu sein (insbesondere ist der End-Iterator nicht dereferenzierbar, aber dekrementierbar).

Konzept

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

template<class I>

concept __LegacyBidirectionalIterator =
    __LegacyForwardIterator<I> && requires(I i)
    {
        {  --i } -> std::same_as<I&>;
        {  i-- } -> std::convertible_to<const I&>;
        { *i-- } -> std::same_as<std::iter_reference_t<I>>;

    };

wobei das exposition-only Konzept __LegacyForwardIterator in LegacyForwardIterator 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 299
(N3066)
C++98 der Rückgabetyp von *a-- war
gefordert, nach T konvertierbar zu sein
geändert den Rückgabe
typ zu reference[1]
LWG 383 C++98 b musste nach --a dereferenzierbar sein stattdessen muss a dereferenzierbar sein
LWG 1212
(N3066)
C++98 der Rückgabetyp von *a-- entsprach nicht dem Rückgabe
typ von *a++, der von LegacyForwardIterator gefordert wurde
geändert den Rückgabe
typ zu reference
  1. Dieses Problem wurde ursprünglich durch N2758 (Iterator-Konzepte) gelöst, das später aus dem C++-Standard entfernt wurde.

[bearbeiten] Siehe auch

spezifiziert, dass ein forward_iterator ein bidirektionaler Iterator ist, der die Rückwärtsbewegung unterstützt
(Konzept) [bearbeiten]
Iterator-Bibliothek stellt Definitionen für Iteratoren, Iterator-Traits, Adaptoren und Hilfsfunktionen bereit