Namensräume
Varianten
Aktionen

std::common_iterator<I,S>::operator++

Von cppreference.com
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
constexpr common_iterator& operator++();
(1) (seit C++20)
constexpr decltype(auto) operator++( int );
(2) (seit C++20)
Hilfstypen
class /*postfix_proxy*/ {

    std::iter_value_t<I> keep_;
    constexpr postfix_proxy(std::iter_reference_t<I>&& x)
        : keep_(std::forward<std::iter_reference_t<I>>(x)) {}
public:
    constexpr const std::iter_value_t<I>& operator*() const noexcept {
        return keep_;
    }

};
(3) (nur Exposition*)

Inkrementiert den zugrundeliegenden Iterator.

Das Verhalten ist undefiniert, wenn das zugrundeliegende std::variant-Mitgliedsobjekt var kein Objekt vom Typ I enthält, d.h. std::holds_alternative<I>(var) ist gleich false.

Sei it der von var gehaltene Iterator vom Typ I, d.h. std::get<I>(var).

1) Prä-Inkrement um eins. Äquivalent zu ++it; return *this;.
2) Post-Inkrement um eins
  • Äquivalent zu: auto tmp = *this; ++*this; return tmp;, wenn I forward_iterator modelliert.
  • Äquivalent zu: return it++;, wenn die Variablendefinition auto&& ref = *it++; wohlgeformt ist, oder entweder
ist false.
  • Äquivalent zu: postfix_proxy p(**this); ++*this; return p; andernfalls, wobei postfix_proxy ein Hilfstyp nur zur Darstellung ist (3).

Inhalt

[bearbeiten] Parameter

(keine)

[bearbeiten] Rückgabewert

1) *this
2) Eine Kopie von *this, die vor der Änderung erstellt wurde, oder ein Ergebnis des Post-Inkrements des zugrundeliegenden Iterators, oder ein Proxy, der den Wert des aktuellen Elements behält, wie oben beschrieben.

[bearbeiten] Beispiel

#include <algorithm>
#include <initializer_list>
#include <iostream>
#include <iterator>
 
int main()
{
    const auto il = {1, 2, 3, 4, 5, 6};
 
    using CI = std::common_iterator<
                   std::counted_iterator<std::initializer_list<int>::iterator>,
                   std::default_sentinel_t
                   >;
 
    CI first{std::counted_iterator{std::begin(il), std::ssize(il) - 2}};
 
    for (; first != std::default_sentinel; ++first)
        std::cout << *first << ' ';
    std::cout << '\n';
}

Ausgabe

1 2 3 4

[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
P2259R1 C++20 Post-Inkrement könnte sein Ergebnis in mehr Situationen verwerfen Eine Proxy-Klasse wird verwendet, um das Ergebnis zu speichern
LWG 3546 C++20 Die Initialisierung des Proxy-Objekts war manchmal nicht wohlgeformt Situation und Definition angepasst
LWG 3574 C++20 variant war vollständig constexpr (P2231R1), aber common_iterator nicht wurde ebenfalls constexpr gemacht
LWG 3595 C++20 Funktionen des Proxy-Typs fehlten constexpr und noexcept hinzugefügt

[bearbeiten] Siehe auch

berechnet die Distanz zwischen zwei Iterator-Adaptoren
(Funktionstemplate) [edit]