std::ranges::lazy_split_view<V, Pattern>::inner_iterator
template< bool Const > struct /*inner_iterator*/; |
(seit C++20) (nur Exposition*) |
|
Der Rückgabetyp von lazy_split_view::outer_iterator::value_type::begin().
Const entspricht dem Template-Argument von outer_iterator.
[edit] Member types
| Mitglied | Definition |
Basis
|
maybe-const <Const, V>((nur zur Veranschaulichung)*) |
iterator_concept
|
|
iterator_category(bedingt vorhanden) |
Nur vorhanden, wenn
|
value_type
|
ranges::range_value_t<Base> |
difference_type
|
ranges::range_difference_t<Base> |
[edit] Data members
| Mitglied | Beschreibung |
outer_iterator<Const> i_ (private) |
ein Iterator in die zugrundeliegende view des Elternobjekts lazy_split_view((exposition-only member object*) |
bool incremented_ (private) |
ein Flag, das angibt, ob der operator++ mindestens einmal auf diesem Objekt aufgerufen wurde ((exposition-only member object*) |
[edit] Member functions
| (Konstruktor) (C++20) |
Konstruiert einen Iterator (öffentliche Memberfunktion) |
| base (C++20) |
gibt den zugrundeliegenden Iterator zurück (öffentliche Memberfunktion) |
| operator* (C++20) |
gibt das aktuelle Element zurück (öffentliche Memberfunktion) |
| operator++operator++(int) (C++20) |
bewegt den Iterator vorwärts (öffentliche Memberfunktion) |
[edit] Member functions
std::ranges::lazy_split_view::inner_iterator::inner_iterator
| /*inner_iterator*/() = default; |
(1) | (seit C++20) |
| constexpr explicit /*inner_iterator*/( /*outer_iterator*/<Const> i ); |
(2) | (seit C++20) |
i_ mit Wertinitialisierung über dessen Standard-Member-Initialisierer (= /*outer_iterator*/<Const>()).Das Datenelement incremented_ wird mit seinem Standard-Member-Initialisierer auf false initialisiert.
std::ranges::lazy_split_view::inner_iterator::base
| constexpr const ranges::iterator_t<Base>& base() const & noexcept; |
(1) | (seit C++20) |
| constexpr ranges::iterator_t<Base> base() && requires ranges::forward_range<V>; |
(2) | (seit C++20) |
Gibt eine Kopie des zugrundeliegenden Iterators zurück.
std::ranges::lazy_split_view::inner_iterator::operator*
| constexpr decltype(auto) operator*() const; |
(seit C++20) | |
Gibt das Element zurück, auf das der zugrundeliegende Iterator zeigt.
Äquivalent zu return *i_./*cur*/();.
std::ranges::lazy_split_view::inner_iterator::operator++
| constexpr /*inner_iterator*/& operator++(); |
(1) | (seit C++20) |
| constexpr decltype(auto) operator++(int); |
(2) | (seit C++20) |
incremented_ = true;
if constexpr (!ranges::forward_range<Base>)
{
if constexpr (Pattern::size() == 0)
return *this;
}
++i_./*cur*/();
if constexpr (ranges::forward_range<Base>)
{
auto tmp = *this;
++*this;
return tmp;
}
else
++*this; // kein return-Statement
[edit] Non-member functions
| operator== (C++20) |
vergleicht die Iteratoren oder den Iterator und std::default_sentinel (Funktion) |
| iter_move (C++20) |
castet das Ergebnis der Dereferenzierung des zugrundeliegenden Iterators in seinen zugehörigen rvalue-Referenztyp (Funktion) |
| iter_swap (C++20) |
tauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen (Funktion) |
operator==(std::ranges::split_view::inner_iterator)
| friend constexpr bool operator==( const /*inner_iterator*/& x, const /*inner_iterator*/& y ) |
(1) | (seit C++20) |
| friend constexpr bool operator==( const /*inner_iterator*/& x, std::default_sentinel_t ); |
(2) | (seit C++20) |
auto [pcur, pend] = ranges::subrange{x.i_.parent_->pattern_}; auto end = ranges::end(x.i_.parent_->base_); if constexpr (/*tiny_range*/<Pattern>) { const auto& cur = x.i_./*cur*/(); if (cur == end) return true; if (pcur == pend) return x.incremented_; return *cur == *pcur; } else { auto cur = x.i_./*cur*/(); if (cur == end) return true; if (pcur == pend) return x.incremented_; do { if (*cur != *pcur) return false; if (++pcur == pend) return true; } while (++cur != end); return false; }
Der Operator != wird aus operator== synthetisiert.
Diese Funktionen sind für normale unqualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch Argument-abhängige Suche gefunden werden, wenn std::ranges::split_view::inner_iterator eine zu den Argumenten assoziierte Klasse ist.
iter_move(std::ranges::split_view::inner_iterator)
| friend constexpr decltype(auto) iter_move( const /*inner_iterator*/& i ) noexcept(noexcept(ranges::iter_move(i.i_./*cur*/()))); |
(seit C++20) | |
Äquivalent zu return ranges::iter_move(i.i_./*cur*/());.
Diese Funktion ist für normale unqualifizierte oder qualifizierte Suche nicht sichtbar und kann nur durch Argument-abhängige Suche gefunden werden, wenn std::ranges::split_view::inner_iterator eine zu den Argumenten assoziierte Klasse ist.
iter_swap(std::ranges::split_view::inner_iterator)
| friend constexpr void iter_swap( const /*inner_iterator*/& x, const /*inner_iterator*/& y ) |
(seit C++20) | |
Äquivalent zu ranges::iter_swap(x.i_./*cur*/(), y.i_./*cur*/()).
Diese Funktion ist für normale unqualifizierte oder qualifizierte Suche nicht sichtbar und kann nur durch Argument-abhängige Suche gefunden werden, wenn std::ranges::split_view::inner_iterator eine zu den Argumenten assoziierte Klasse ist.
[edit] Defect reports
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 3591 | C++20 | die && Überladung von base könnte äußere Iteratoren ungültig machen |
constraints hinzugefügt |
| LWG 3593 | C++20 | die const& Überladung von base gibt eine Referenz zurück, ist aber möglicherweise nicht noexcept |
wurde zu `noexcept` gemacht |