Namespaces
Variants

Standard library header <ranges> (C++20)

From cppreference.net
Standard library headers

Dieser Header ist Teil der ranges -Bibliothek.

Inhaltsverzeichnis

Namespace-Aliase

namespace std {

namespace views = ranges :: views ;

}

Der Namensbereich-Alias std::views wird als Kurzform für std::ranges::views bereitgestellt.

Includes

(C++20)
Unterstützung für den Drei-Wege-Vergleichsoperator
std::initializer_list Klassentemplate
Bereichs-Iteratoren

Konzepte

Bereichskonzepte
Definiert im namespace std::ranges
gibt an, dass ein Typ ein Range ist, also einen begin -Iterator und einen end -Sentinel bereitstellt
(Konzept)
spezifiziert, dass ein Typ ein range ist und Iteratoren, die von einem Ausdruck davon erhalten werden, sicher zurückgegeben werden können ohne Gefahr von Dangling-Iteratoren
(Konzept)
gibt an, dass ein Bereich seine Größe in konstanter Zeit schätzen kann
(Konzept)
spezifiziert, dass ein Bereich seine Größe in konstanter Zeit kennt
(Konzept)
gibt an, dass ein Range eine View ist, d.h. es hat konstante Zeit für Kopieren/Verschieben/Zuweisen
(Konzept)
spezifiziert einen Bereich, dessen Iteratortyp input_iterator erfüllt
(Konzept)
spezifiziert einen Bereich, dessen Iteratortyp output_iterator erfüllt
(Konzept)
spezifiziert einen Bereich, dessen Iteratortyp forward_iterator erfüllt
(Konzept)
spezifiziert einen Bereich, dessen Iteratortyp bidirectional_iterator erfüllt
(Konzept)
spezifiziert einen Bereich, dessen Iteratortyp random_access_iterator erfüllt
(Konzept)
spezifiziert einen Bereich, dessen Iteratortyp contiguous_iterator erfüllt
(Konzept)
spezifiziert, dass ein Range identische Iterator- und Sentinel-Typen besitzt
(Konzept)
spezifiziert die Anforderungen dafür, dass ein range sicher in einen view konvertierbar ist
(Konzept)
spezifiziert, dass ein Bereich schreibgeschützte Elemente besitzt
(Konzept)

Funktionen

Bereichskonvertierungen
Definiert im namespace std::ranges
(C++23)
Konstruiert ein neues Nicht-View-Objekt aus einem Eingabebereich
(Funktions-Template)

Klassen

Bereichsprimitive
Definiert im namespace std::ranges
ermittelt Iterator- und Sentinel-Typen eines Ranges
(Alias-Template)
ermittelt Größen-, Differenz- und Werttypen eines Ranges
(Alias-Template)
erhält Referenztypen eines Bereichs
(Alias-Template)
Ansichten
Definiert im namespace std::ranges
Hilfsklassen-Template zur Definition einer view unter Verwendung des Curiously Recurring Template Pattern
(Klassen-Template)
kombiniert ein Iterator-Sentinel-Paar zu einer view
(Klassentemplate)
Behandlung hängender Iteratoren
Definiert im namespace std::ranges
ein Platzhaltertyp, der anzeigt, dass ein Iterator oder ein subrange nicht zurückgegeben werden sollte, da er dangling wäre
(Klasse)
Ermittelt den Iteratortyp oder subrange -Typ eines borrowed_range
(Alias-Template)
Weitere Hilfsprogramme
Definiert im namespace std::ranges
kennzeichnet einen Bereich, der als Sequenz statt als einzelner Wert behandelt werden soll
(Klassentemplate)
Fabriken
Definiert im namespace std::ranges
eine leere view ohne Elemente
(Klassentemplate) (Variablemtemplate)
eine view , die ein einzelnes Element eines bestimmten Wertes enthält
(Klassentemplate) (Anpassungspunktobjekt)
eine view bestehend aus einer Sequenz, die durch wiederholtes Inkrementieren eines Anfangswerts erzeugt wird
(Klassen-Template) (Customization Point Object)
eine view bestehend aus einer generierten Sequenz durch wiederholtes Erzeugen desselben Werts
(Klassentemplate) (Anpassungspunktobjekt)
Eine view bestehend aus den Elementen, die durch sukzessive Anwendung von operator>> auf den zugehörigen Eingabestrom erhalten werden
(Klassentemplate) (Anpassungspunktobjekt)
Adaptoren
Definiert im Namespace std::ranges
Hilfsklassen-Template zur Definition eines Range-Adaptor-Closure-Objekts
(Klassen-Template)
eine view , die alle Elemente eines range enthält
(Alias-Template) (Range-Adaptor-Objekt)
eine view der Elemente eines anderen range
(Klassen-Template)
eine view mit eindeutigem Besitz eines range
(Klassentemplate)
eine view einer Sequenz, die jedes Element zu einem Rvalue castet
(Klassentemplate) (Range-Adapter-Objekt)
eine view , die aus den Elementen eines range besteht, die ein Prädikat erfüllen
(Klassen-Template) (Range-Adapter-Objekt)
eine view einer Sequenz, die eine Transformationsfunktion auf jedes Element anwendet
(Klassen-Template) (Range-Adapter-Objekt)
eine view bestehend aus den ersten N Elementen einer anderen view
(Klassen-Template) (Range-Adapter-Objekt)
eine view , bestehend aus den Anfangselementen einer anderen view , bis zum ersten Element, bei dem ein Prädikat false zurückgibt
(Klassentemplate) (Range-Adapter-Objekt)
eine view , bestehend aus Elementen einer anderen view , die die ersten N Elemente überspringt
(Klassentemplate) (Range-Adapter-Objekt)
eine view , bestehend aus den Elementen einer anderen view , die das anfängliche Teilelement überspringt, bis zum ersten Element, bei dem das Prädikat false zurückgibt
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus der Sequenz, die durch Glätten einer view von range s erhalten wird
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus der Sequenz, die durch das Abflachen einer View von Ranges erhalten wird, mit dem Trennzeichen zwischen Elementen
(Klassentemplate) (Range-Adapter-Objekt)
eine view über die Teilbereiche, die durch Aufteilung einer anderen view mittels eines Trennzeichens erhalten werden
(Klassentemplate) (Range-Adapter-Objekt)
eine view über die Teilbereiche, die durch Aufteilung einer anderen view mittels eines Trennzeichens erhalten werden
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus der Verkettung der angepassten Views
(Klassen-Template) (Customization Point Object)
Erstellt einen Subrange aus einem Iterator und einer Anzahl
(Anpassungspunktobjekt)
wandelt eine view in einen common_range um
(Klassen-Template) (Range-Adapter-Objekt)
eine view , die über die Elemente einer anderen bidirektionalen View in umgekehrter Reihenfolge iteriert
(Klassentemplate) (Range-Adapter-Objekt)
wandelt eine view in einen constant_range um
(Klassentemplate) (Range-Adapter-Objekt)
nimmt eine view bestehend aus tuple-like Werten und eine Zahl N und erzeugt eine view des N ten Elements jedes Tupels
(Klassentemplate) (Range-Adapter-Objekt)
nimmt eine view bestehend aus paarartigen Werten und erzeugt eine view der ersten Elemente jedes Paares
(Klassentemplate) (Range-Adapter-Objekt)
nimmt eine view bestehend aus paarartigen Werten und erzeugt eine view der zweiten Elemente jedes Paares
(Klassentemplate) (Range-Adapter-Objekt)
eine view , die jedes Element der adaptierten Sequenz auf ein Tupel aus der Position des Elements und seinem Wert abbildet
(Klassentemplate) (Range-Adaptor-Objekt)
eine view bestehend aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views
(Klassentemplate) (Customization Point Object)
eine view bestehend aus Ergebnissen der Anwendung einer Transformationsfunktion auf entsprechende Elemente der adaptierten Views
(Klassentemplate) (Customization Point Object)
eine view bestehend aus Tupeln von Referenzen auf benachbarte Elemente der adaptierten Ansicht
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus Ergebnissen der Anwendung einer Transformationsfunktion auf benachbarte Elemente der adaptierten view
(Klassentemplate) (Range-Adapter-Objekt)
eine Range von view s , die N -große, nicht überlappende aufeinanderfolgende Teilstücke der Elemente einer anderen view darstellen
(Klassentemplate) (Range-Adapter-Objekt)
eine view deren M tes Element eine view über das M te bis (M + N - 1) te Element einer anderen view ist
(Klassentemplate) (Range-Adapter-Objekt)
teilt die view in Subbereiche zwischen jedem Paar benachbarter Elemente auf, für die das gegebene Prädikat false zurückgibt
(Klassentemplate) (Range-Adapter-Objekt)
eine view , bestehend aus Elementen einer anderen view , die jeweils um N Elemente voranschreitet
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus Tupeln von Ergebnissen, die durch das n-äre kartesische Produkt der adaptierten Views berechnet werden
(Klassentemplate) (Anpassungspunktobjekt)
eine view , die das zuletzt abgerufene Element ihrer zugrundeliegenden Sequenz zwischenspeichert
(Klassentemplate) (Range-Adapter-Objekt)
wandelt eine view in einen Bereich um, der ausschließlich ein input_range ist und kein common_range
(Klassentemplate) (Bereichsadapterobjekt)

Customization Point Objects

Bereichszugriff
Definiert im namespace std::ranges
gibt einen Iterator zum Anfang eines Bereichs zurück
(Anpassungspunktobjekt)
gibt einen Sentinel zurück, der das Ende eines Bereichs anzeigt
(Anpassungspunktobjekt)
gibt einen Iterator zum Anfang eines schreibgeschützten Bereichs zurück
(Anpassungspunktobjekt)
gibt einen Sentinel zurück, der das Ende eines schreibgeschützten Bereichs anzeigt
(Anpassungspunktobjekt)
gibt einen Reverse-Iterator für einen Bereich zurück
(Customization Point Object)
gibt einen umgekehrten End-Iterator für einen Bereich zurück
(Anpassungspunktobjekt)
gibt einen Reverse-Iterator für einen schreibgeschützten Bereich zurück
(Anpassungspunktobjekt)
gibt einen umgekehrten End-Iterator für einen schreibgeschützten Bereich zurück
(Anpassungspunktobjekt)
gibt einen Integer gleich dem Reserve-Hint zurück, der von einem Range gegeben wird
(Anpassungspunktobjekt)
gibt eine Ganzzahl gleich der Größe eines Bereichs zurück
(Anpassungspunktobjekt)
gibt einen vorzeichenbehafteten Integer zurück, der gleich der Größe eines Ranges ist
(Anpassungspunktobjekt)
prüft, ob ein Range leer ist
(Anpassungspunktobjekt)
erhält einen Zeiger auf den Anfang eines zusammenhängenden Bereichs
(Anpassungspunktobjekt)
erhält einen Zeiger auf den Anfang eines schreibgeschützten zusammenhängenden Bereichs
(Anpassungspunktobjekt)

Aufzählungen

Definiert im namespace std::ranges
gibt an, ob ein std::ranges::subrange das Konzept std::ranges::sized_range modelliert
(enum)

Helfer

ermittelt die Größe eines std::ranges::subrange
(Klassen-Template-Spezialisierung)
Ermittelt den Typ des Iterators oder des Sentinels eines std::ranges::subrange
(Klassen-Template-Spezialisierung)
erhält Iterator oder Sentinel aus einem std::ranges::subrange
(Funktions-Template)
From-Range-Konstruktions-Tag
(Tag)

Übersicht

// größtenteils freistehend
#include <compare>
#include <initializer_list>
#include <iterator>
namespace std::ranges {
  inline namespace /* nicht spezifiziert */ {
    // Bereichszugriff
    inline constexpr /* nicht spezifiziert */ begin        = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ end          = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ cbegin       = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ cend         = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ rbegin       = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ rend         = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ crbegin      = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ crend        = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ size         = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ reserve_hint = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ ssize        = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ empty        = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ data         = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ cdata        = /* nicht spezifiziert */;
  }
  // Bereiche
  template<class T>
  concept range = /* siehe Beschreibung */;
  template<class T>
  constexpr bool enable_borrowed_range = false;
  template<class T>
  concept borrowed_range = /* siehe Beschreibung */;
  template<class T>
  using iterator_t = decltype(ranges::begin(declval<T&>()));
  template<range R>
  using sentinel_t = decltype(ranges::end(declval<R&>()));
  template<range R>
  using const_iterator_t = decltype(ranges::cbegin(declval<R&>()));
  template<range R>
  using const_sentinel_t = decltype(ranges::cend(declval<R&>()));
  template<range R>
  using range_difference_t = iter_difference_t<iterator_t<R>>;
  template<sized_range R>
  using range_size_t = decltype(ranges::size(declval<R&>()));
  template<range R>
  using range_value_t = iter_value_t<iterator_t<R>>;
  template<range R>
  using range_reference_t = iter_reference_t<iterator_t<R>>;
  template<range R>
  using range_const_reference_t = iter_const_reference_t<iterator_t<R>>;
  template<range R>
  using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>;
  template<range R>
  using range_common_reference_t = iter_common_reference_t<iterator_t<R>>;
  // sized ranges
  template<class>
  constexpr bool disable_sized_range = false;
  template<class T>
  concept approximately_sized_range = /* siehe Beschreibung */;
  template<class T>
  concept sized_range = /* siehe Beschreibung */;
  // Ansichten
  template<class T>
  constexpr bool enable_view = /* siehe Beschreibung */;
  struct view_base
  {};
  template<class T>
  concept view = /* siehe Beschreibung */;
  // andere Bereichsverfeinerungen
  template<class R, class T>
  concept output_range = /* siehe Beschreibung */;
  template<class T>
  concept input_range = /* siehe Beschreibung */;
  template<class T>
  concept forward_range = /* siehe Beschreibung */;
  template<class T>
  concept bidirectional_range = /* siehe Beschreibung */;
  template<class T>
  concept random_access_range = /* siehe Beschreibung */;
  template<class T>
  concept contiguous_range = /* siehe Beschreibung */;
  template<class T>
  concept common_range = /* siehe Beschreibung */;
  template<class T>
  concept viewable_range = /* siehe Beschreibung */;
  template<class T>
  concept constant_range = /* siehe Beschreibung */;
  // Klassentemplate view_interface
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class view_interface;
  // Teilbereiche
  enum class subrange_kind : bool
  {
    unsized,
    sized
  };
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K =
             /* siehe Beschreibung */>
    requires(K == subrange_kind::sized || !sized_sentinel_for<S, I>)
  class subrange;
  template<class I, class S, subrange_kind K>
  constexpr bool enable_borrowed_range<subrange<I, S, K>> = true;
  template<size_t N, class I, class S, subrange_kind K>
    requires((N == 0 && copyable<I>) || N == 1)
  constexpr auto get(const subrange<I, S, K>& r);
  template<size_t N, class I, class S, subrange_kind K>
    requires(N < 2)
  constexpr auto get(subrange<I, S, K>&& r);
}
namespace std {
  using ranges::get;
}
namespace std::ranges {
  // Behandlung hängender Iteratoren
  struct dangling;
  // Klassentemplate elements_of
  template<range R, class Allocator = allocator<byte>>
  struct elements_of; // gehostet
  template<range R>
  using borrowed_iterator_t = /* siehe Beschreibung */;
  template<range R>
  using borrowed_subrange_t = /* siehe Beschreibung */;
  // Bereichskonvertierungen
  template<class C, input_range R, class... Args>
    requires(!view<C>)
  constexpr C to(R&& r, Args&&... args);
  template<template<class...> class C, input_range R, class... Args>
  constexpr auto to(R&& r, Args&&... args);
  template<class C, class... Args>
    requires(!view<C>)
  constexpr auto to(Args&&... args);
  template<template<class...> class C, class... Args>
  constexpr auto to(Args&&... args);
  // leere Ansicht
  template<class T>
    requires is_object_v<T>
  class empty_view;
  template<class T>
  constexpr bool enable_borrowed_range<empty_view<T>> = true;
  namespace views {
    template<class T>
    constexpr empty_view<T> empty{};
  }
  // Einzelansicht
  template<move_constructible T>
    requires is_object_v<T>
  class single_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ single = /* nicht spezifiziert */;
  }
  template<bool Const, class T>
  using /*vielleicht-konst*/ = conditional_t<Const, const T, T>; // exposition-only
  // iota-Ansicht
  template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t>
    requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W>
  class iota_view;
  template<class W, class Bound>
  constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true;
  namespace views {
    inline constexpr /* nicht spezifiziert */ iota = /* nicht spezifiziert */;
  }
  // Wiederholungsansicht
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
    requires /* siehe Beschreibung */
  class repeat_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ repeat = /* nicht spezifiziert */;
  }
  // istream-Ansicht
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
    requires                /* siehe Beschreibung */
  class basic_istream_view; // gehostet
  template<class Val>
  using istream_view = basic_istream_view<Val, char>; // gehostet
  template<class Val>
  using wistream_view = basic_istream_view<Val, wchar_t>; // gehostet
  namespace views {
    template<class T>
    constexpr /* nicht spezifiziert */ istream = /* nicht spezifiziert */; // gehostet
  }
  // Range-Adapter-Objekte
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class range_adaptor_closure
  {};
  // alle Ansicht
  namespace views {
    inline constexpr /* nicht spezifiziert */ all = /* nicht spezifiziert */;
    template<viewable_range R>
    using all_t = decltype(all(declval<R>()));
  }
  // Referenzansicht
  template<range R>
    requires is_object_v<R>
  class ref_view;
  template<class T>
  constexpr bool enable_borrowed_range<ref_view<T>> = true;
  // owning view
  template<range R>
    requires /* siehe Beschreibung */
  class owning_view;
  template<class T>
  constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>;
  // als Rvalue-Ansicht
  template<view V>
    requires input_range<V>
  class as_rvalue_view;
  template<class T>
  constexpr bool enable_borrowed_range<as_rvalue_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ as_rvalue = /* nicht spezifiziert */;
  }
  // Filteransicht
  template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class filter_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ filter = /* nicht spezifiziert */;
  }
  // Transform-Ansicht
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*kann-referenziert-werden*/<invoke_result_t<F&, range_reference_t<V>>>
  class transform_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ transform = /* nicht spezifiziert */;
  }
  // Ansicht übernehmen
  template<view>
  class take_view;
  template<class T>
  constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ take = /* nicht spezifiziert */;
  }
  // take while view
  template<view V, class Pred>
    requires input_range<V> && is_object_v<Pred> &&
             indirect_unary_predicate<const Pred, iterator_t<V>>
  class take_while_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ take_while = /* nicht spezifiziert */;
  }
  // Ansicht löschen
  template<view V>
  class drop_view;
  template<class T>
  constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ drop = /* nicht spezifiziert */;
  }
  // Drop-While-Ansicht
  template<view V, class Pred>
    requires input_range<V> && is_object_v<Pred> &&
             indirect_unary_predicate<const Pred, iterator_t<V>>
  class drop_while_view;
  template<class T, class Pred>
  constexpr bool enable_borrowed_range<drop_while_view<T, Pred>> =
    enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ drop_while = /* nicht spezifiziert */;
  }
  // Join-Ansicht
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ join = /* nicht spezifiziert */;
  }
  // mit View verknüpfen
  template<input_range V, forward_range Pattern>
    requires /* siehe Beschreibung */
  class join_with_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ join_with = /* nicht spezifiziert */;
  }
  // Lazy Split-Ansicht
  template<class R>
  concept /*tiny-range*/ = /* siehe Beschreibung */; // exposition-only
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  class lazy_split_view;
  // geteilte Ansicht
  template<forward_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
  class split_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ lazy_split = /* nicht spezifiziert */;
    inline constexpr /* nicht spezifiziert */ split      = /* nicht spezifiziert */;
  }
  // Verkettungsansicht
  template<input_range... Ansichten>
    requires /* siehe Beschreibung */
  class concat_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ concat = /* nicht spezifiziert */;
  }
  // gezählte Ansicht
  namespace views {
    inline constexpr /* nicht spezifiziert */ counted = /* nicht spezifiziert */;
  }
  // allgemeine Ansicht
  template<view V>
    requires(!common_range<V> && copyable<iterator_t<V>>)
  class common_view;
  template<class T>
  constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ common = /* nicht spezifiziert */;
  }
  // Reverse-Ansicht
  template<view V>
    requires bidirectional_range<V>
  class reverse_view;
  template<class T>
  constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ reverse = /* nicht spezifiziert */;
  }
  // als const-Ansicht
  template<input_range R>
  constexpr auto& /*möglicherweise-konstanter-Bereich*/(R& r) noexcept
  { // exposition-only
    if constexpr (input_range<const R>) {
      return const_cast<const R&>(r);
    } else {
      return r;
    }
  }
  template<view V>
    requires input_range<V>
  class as_const_view;
  template<class T>
  constexpr bool enable_borrowed_range<as_const_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ as_const = /* nicht spezifiziert */;
  }
  // Elemente-Ansicht
  template<input_range V, size_t N>
    requires /* siehe Beschreibung */
  class elements_view;
  template<class T, size_t N>
  constexpr bool enable_borrowed_range<elements_view<T, N>> = enable_borrowed_range<T>;
  template<class R>
  using keys_view = elements_view<R, 0>;
  template<class R>
  using values_view = elements_view<R, 1>;
  namespace views {
    template<size_t N>
    constexpr /* nicht spezifiziert */ elements = /* nicht spezifiziert */;
    inline constexpr auto keys           = elements<0>;
    inline constexpr auto values         = elements<1>;
  }
  // Ansicht aufzählen
  template<view V>
    requires /* siehe Beschreibung */
  class enumerate_view;
  template<class View>
  constexpr bool enable_borrowed_range<enumerate_view<View>> =
    enable_borrowed_range<View>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ enumerate = /* nicht spezifiziert */;
  }
  // Zip-Ansicht
  template<input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view;
  template<class... Ansichten>
  constexpr bool enable_borrowed_range<zip_view<Views...>> =
    (enable_borrowed_range<Views> && ...);
  namespace views {
    inline constexpr /* nicht spezifiziert */ zip = /* nicht spezifiziert */;
  }
  // Zip-Transform-Ansicht
  template<move_constructible F, input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*kann-referenziert-werden*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ zip_transform = /* nicht spezifiziert */;
  }
  // benachbarte Ansicht
  template<forward_range V, size_t N>
    requires view<V> && (N > 0)
  class adjacent_view;
  template<class V, size_t N>
  constexpr bool enable_borrowed_range<adjacent_view<V, N>> = enable_borrowed_range<V>;
  namespace views {
    template<size_t N>
    constexpr /* nicht spezifiziert */ adjacent = /* nicht spezifiziert */;
    inline constexpr auto pairwise       = adjacent<2>;
  }
  // Adjacent-Transform-Ansicht
  template<forward_range V, move_constructible F, size_t N>
    requires /* siehe Beschreibung */
  class adjacent_transform_view;
  namespace views {
    template<size_t N>
    constexpr /* nicht spezifiziert */ adjacent_transform = /* nicht spezifiziert */;
    inline constexpr auto pairwise_transform       = adjacent_transform<2>;
  }
  // Chunk-Ansicht
  template<view V>
    requires input_range<V>
  class chunk_view;
  template<view V>
    requires forward_range<V>
  class chunk_view<V>;
  template<class V>
  constexpr bool enable_borrowed_range<chunk_view<V>> =
    forward_range<V> && enable_borrowed_range<V>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ chunk = /* nicht spezifiziert */;
  }
  // Slide-Ansicht
  template<forward_range V>
    requires view<V>
  class slide_view;
  template<class V>
  constexpr bool enable_borrowed_range<slide_view<V>> = enable_borrowed_range<V>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ slide = /* nicht spezifiziert */;
  }
  // chunk by view
  template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class chunk_by_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ chunk_by = /* nicht spezifiziert */;
  }
  // Stride-Ansicht
  template<input_range V>
    requires view<V>
  class stride_view;
  template<class V>
  constexpr bool enable_borrowed_range<stride_view<V>> = enable_borrowed_range<V>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ stride = /* nicht spezifiziert */;
  }
  // kartesische Produktansicht
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  class cartesian_product_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ cartesian_product = /* nicht spezifiziert */;
  }
  // Cache der letzten Ansicht
  template<input_range V>
    requires view<V>
  class cache_latest_view;
  namespace views {
    inline constexpr /* nicht spezifiziert */ cache_latest = /* nicht spezifiziert */;
  }
  // zur Eingabeansicht
  template<input_range V>
    requires view<V>
  class to_input_view;
  template<class V>
  constexpr bool enable_borrowed_range<to_input_view<V>> = enable_borrowed_range<V>;
  namespace views {
    inline constexpr /* nicht spezifiziert */ to_input = /* nicht spezifiziert */;
  }
}
namespace std {
  namespace views = ranges::Ansichten;
  template<class T>
  struct tuple_size;
  template<size_t I, class T>
  struct tuple_element;
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_size<ranges::subrange<I, S, K>> : integral_constant<size_t, 2>
  {};
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_element<0, ranges::subrange<I, S, K>>
  {
    using type = I;
  };
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_element<1, ranges::subrange<I, S, K>>
  {
    using type = S;
  };
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_element<0, const ranges::subrange<I, S, K>>
  {
    using type = I;
  };
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_element<1, const ranges::subrange<I, S, K>>
  {
    using type = S;
  };
  struct from_range_t
  {
    explicit from_range_t() = default;
  };
  inline constexpr from_range_t from_range{};
}

Konzept range

namespace std::ranges {
  template<class T>
  concept range = requires(T& t) {
    ranges::begin(t); // manchmal gleichheitserhaltend (siehe Beschreibung)
    ranges::end(t);
  };
}

Konzept borrowed_range

namespace std::ranges {
  template<class T>
  concept borrowed_range =
    range<T> && (is_lvalue_reference_v<T> || enable_borrowed_range<remove_cvref_t<T>>);
}

Konzept approximately_sized_range

namespace std::ranges {
  template<class T>
  concept approximately_sized_range = range<T> && requires(T& t) {
    ranges::reserve_hint(t);
  };
}

Konzept sized_range

namespace std::ranges {
  template<class T>
  concept sized_range = approximately_sized_range<T> && requires(T& t) {
    ranges::size(t);
  };
}

Konzept view

namespace std::ranges {
  template<class T>
  constexpr bool /*is-derived-from-view-interface*/ =
    /* siehe Beschreibung */; // nur zur Darstellung
  template<class T>
  constexpr bool enable_view =
    derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>;
  template<class T>
  concept view = range<T> && movable<T> && enable_view<T>;
}

Konzept output_range

namespace std::ranges {
  template<class R, class T>
  concept output_range = range<R> && output_iterator<iterator_t<R>, T>;
}

Konzept input_range

namespace std::ranges {
  template<class T>
  concept input_range = range<T> && input_iterator<iterator_t<T>>;
}

Konzept forward_range

namespace std::ranges {
  template<class T>
  concept forward_range = input_range<T> && forward_iterator<iterator_t<T>>;
}

Konzept bidirectional_range

namespace std::ranges {
  template<class T>
  concept bidirectional_range = forward_range<T> && bidirectional_iterator<iterator_t<T>>;
}

Konzept random_access_range

namespace std::ranges {
  template<class T>
  concept random_access_range =
    bidirectional_range<T> && random_access_iterator<iterator_t<T>>;
}

Konzept contiguous_range

namespace std::ranges {
  template<class T>
  concept contiguous_range =
    random_access_range<T> && contiguous_iterator<iterator_t<T>> && requires(T& t) {
      {
        ranges::data(t)
      } -> same_as<add_pointer_t<range_reference_t<T>>>;
    };
}

Konzept common_range

namespace std::ranges {
  template<class T>
  concept common_range = range<T> && same_as<iterator_t<T>, sentinel_t<T>>;
}

Konzept viewable_range

namespace std::ranges {
  template<class T>
  concept viewable_range =
    range<T> && ((view<remove_cvref_t<T>> && constructible_from<remove_cvref_t<T>, T>) ||
                 (!view<remove_cvref_t<T>> &&
                  (is_lvalue_reference_v<T> ||
                   (movable<remove_reference_t<T>> && !/*is-initializer-list*/<T>))));
}
**Anmerkung:** Der gesamte Code innerhalb der `
` und `` Tags wurde gemäß den Anweisungen nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Tags und Attribute wurden ebenfalls unverändert beibehalten.

Konzept constant_range

namespace std::ranges {
  template<class T>
  concept constant_range = input_range<T> && /*konstanter-Iterator*/<iterator_t<T>>;
}

Hilfskonzepte

Hinweis: Die Konzepte in diesem Abschnitt dienen nur der Darstellung und sind nicht Teil der Schnittstelle.

namespace std::ranges { // nicht spezifiziert, nur für Namenssuche
  template<class R>
  concept /*simple-view*/ = // nur zur Darstellung
    view<R> && range<const R> && same_as<iterator_t<R>, iterator_t<const R>> &&
    same_as<sentinel_t<R>, sentinel_t<const R>>;
  template<class I>
  concept /*has-arrow*/ = // nur zur Darstellung
    input_iterator<I> && (is_pointer_v<I> || requires(const I i) { i.operator->(); });
  template<class T, class U>
  concept /*different-from*/ = // nur zur Darstellung
    !same_as<remove_cvref_t<T>, remove_cvref_t<U>>;
  template<class R>
  concept /*range-with-movable-references*/ = // nur zur Darstellung
    input_range<R> && move_constructible<range_reference_t<R>> &&
    move_constructible<range_rvalue_reference_t<R>>;
  template<class R>
  constexpr bool /*is-initializer-list*/ = /* siehe Beschreibung */; // nur zur Darstellung
  template<class T>
  constexpr auto
  /*as-const-pointer*/(const T* p) noexcept
  {
    return p;
  } // nur zur Darstellung
}

Klassentemplate std::ranges::view_interface

namespace std::ranges {
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class view_interface
  {
  private:
    constexpr D& /*abgeleitet*/() noexcept
    { // exposition-only
      return static_cast<D&>(*this);
    }
    constexpr const D& /*abgeleitet*/() const noexcept
    { // exposition-only
      return static_cast<const D&>(*this);
    }
  public:
    constexpr bool empty()
      requires sized_range<D> || forward_range<D>
    {
      if constexpr (sized_range<D>)
        return ranges::size(/*abgeleitet*/()) == 0;
      else
        return ranges::begin(/*abgeleitet*/()) == ranges::end(/*abgeleitet*/());
    }
    constexpr bool empty() const
      requires sized_range<const D> || forward_range<const D>
    {
      if constexpr (sized_range<const D>)
        return ranges::size(/*abgeleitet*/()) == 0;
      else
        return ranges::begin(/*abgeleitet*/()) == ranges::end(/*abgeleitet*/());
    }
    constexpr auto cbegin()
      requires input_range<D>
    {
      return ranges::cbegin(/*abgeleitet*/());
    }
    constexpr auto cbegin() const
      requires input_range<const D>
    {
      return ranges::cbegin(/*abgeleitet*/());
    }
    constexpr auto cend()
      requires input_range<D>
    {
      return ranges::cend(/*abgeleitet*/());
    }
    constexpr auto cend() const
      requires input_range<const D>
    {
      return ranges::cend(/*abgeleitet*/());
    }
    constexpr explicit operator bool()
      requires requires { ranges::empty(/*abgeleitet*/()); }
    {
      return !ranges::empty(/*abgeleitet*/());
    }
    constexpr explicit operator bool() const
      requires requires { ranges::empty(/*abgeleitet*/()); }
    {
      return !ranges::empty(/*abgeleitet*/());
    }
    constexpr auto data()
      requires contiguous_iterator<iterator_t<D>>
    {
      return to_address(ranges::begin(/*abgeleitet*/()));
    }
    constexpr auto data() const
      requires range<const D> && contiguous_iterator<iterator_t<const D>>
    {
      return to_address(ranges::begin(/*abgeleitet*/()));
    }
    constexpr auto size()
      requires forward_range<D> && sized_sentinel_for<sentinel_t<D>, iterator_t<D>>
    {
      return /*to-unsigned-like*/(ranges::end(/*abgeleitet*/()) -
                                  ranges::begin(/*abgeleitet*/()));
    }
    constexpr auto size() const
      requires forward_range<const D> &&
               sized_sentinel_for<sentinel_t<const D>, iterator_t<const D>>
    {
      return /*to-unsigned-like*/(ranges::end(/*abgeleitet*/()) -
                                  ranges::begin(/*abgeleitet*/()));
    }
    constexpr decltype(auto) front()
      requires forward_range<D>;
    constexpr decltype(auto) front() const
      requires forward_range<const D>;
    constexpr decltype(auto) back()
      requires bidirectional_range<D> && common_range<D>;
    constexpr decltype(auto) back() const
      requires bidirectional_range<const D> && common_range<const D>;
    template<random_access_range R = D>
    constexpr decltype(auto) operator[](range_difference_t<R> n)
    {
      return ranges::begin(/*abgeleitet*/())[n];
    }
    template<random_access_range R = const D>
    constexpr decltype(auto) operator[](range_difference_t<R> n) const
    {
      return ranges::begin(/*abgeleitet*/())[n];
    }
  };
}

Klassentemplate std::ranges::subrange

namespace std::ranges {
  template<class From, class To>
  concept /*verwendet-Nichtqualifizierungs-Zeigerkonvertierung*/ = // exposition-only
    is_pointer_v<From> && is_pointer_v<To> &&
    !convertible_to<remove_pointer_t<From> (*)[], remove_pointer_t<To> (*)[]>;
  template<class From, class To>
  concept /*in-nicht-schneidend-konvertierbar*/ = // exposition-only
    convertible_to<From, To> &&
    !/*verwendet-Nichtqualifizierungs-Zeigerkonvertierung*/<decay_t<From>, decay_t<To>>;
  template<class T, class U, class V>
  concept /*pair-like-convertible-from*/ = // exposition-only
    !range<T> && !is_reference_v<T> && /*paarartig*/<T> && constructible_from<T, U, V> &&
    /*in-nicht-schneidend-konvertierbar*/<U, tuple_element_t<0, T>> &&
    convertible_to<V, tuple_element_t<1, T>>;
  template<input_or_output_iterator I,
           sentinel_for<I> S = I,
           subrange_kind K =
             sized_sentinel_for<S, I> ? subrange_kind::sized : subrange_kind::unsized>
    requires(K == subrange_kind::sized || !sized_sentinel_for<S, I>)
  class subrange : public view_interface<subrange<I, S, K>>
  {
  private:
    static constexpr bool /*StoreSize*/ = // exposition-only
      K == subrange_kind::sized && !sized_sentinel_for<S, I>;
    I /*begin_*/ = I(); // exposition-only
    S /*end_*/   = S(); // exposition-only
    /*make-unsigned-like-t*/<iter_difference_t<I>> /*size_*/ =
      0; // exposition-only present only
         // wenn StoreSize true ist
  public:
    subrange()
      requires default_initializable<I>
    = default;
    constexpr subrange(/*in-nicht-schneidend-konvertierbar*/<I> auto i, S s)
      requires(!/*StoreSize*/);
    constexpr subrange(/*in-nicht-schneidend-konvertierbar*/<I> auto i,
                       S s,
                       /*make-unsigned-like-t*/<iter_difference_t<I>> n)
      requires(K == subrange_kind::sized);
    template</*anders-als*/<subrange> R>
      requires borrowed_range<R> && /*in-nicht-schneidend-konvertierbar*/<iterator_t<R>, I> &&
               convertible_to<sentinel_t<R>, S>
               constexpr subrange(R&& r)
                 requires(!/*StoreSize*/ || sized_range<R>);
    template<borrowed_range R>
      requires /*in-nicht-schneidend-konvertierbar*/<iterator_t<R>, I> &&
               convertible_to<sentinel_t<R>, S>
               constexpr subrange(R&& r, /*make-unsigned-like-t*/<iter_difference_t<I>> n)
                 requires(K == subrange_kind::sized)
      : subrange{ ranges::begin(r), ranges::end(r), n }
    {
    }
    template</*anders-als*/<subrange> PairLike>
      requires /*pair-like-convertible-from*/<PairLike, const I&, const S&>
    constexpr operator PairLike() const;
    constexpr I begin() const
      requires copyable<I>;
    constexpr I begin()
      requires(!copyable<I>);
    constexpr S end() const;
    constexpr bool empty() const;
    constexpr /*make-unsigned-like-t*/<iter_difference_t<I>> size() const
      requires(K == subrange_kind::sized);
    constexpr subrange next(iter_difference_t<I> n = 1) const&
      requires forward_iterator<I>;
    constexpr subrange next(iter_difference_t<I> n = 1) &&;
    constexpr subrange prev(iter_difference_t<I> n = 1) const
      requires bidirectional_iterator<I>;
    constexpr subrange& advance(iter_difference_t<I> n);
  };
  template<input_or_output_iterator I, sentinel_for<I> S>
  subrange(I, S) -> subrange<I, S>;
  template<input_or_output_iterator I, sentinel_for<I> S>
  subrange(I, S, /*make-unsigned-like-t*/<iter_difference_t<I>>)
    -> subrange<I, S, subrange_kind::sized>;
  template<borrowed_range R>
  subrange(R&&)
    -> subrange<iterator_t<R>,
                sentinel_t<R>,
                (sized_range<R> || sized_sentinel_for<sentinel_t<R>, iterator_t<R>>)
                  ? subrange_kind::sized
                  : subrange_kind::unsized>;
  template<borrowed_range R>
  subrange(R&&, /*make-unsigned-like-t*/<range_difference_t<R>>)
    -> subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>;
}

Klasse std::ranges::dangling

namespace std::ranges {
  struct dangling
  {
    constexpr dangling() noexcept = default;
    constexpr dangling(auto&&...) noexcept {}
  };
}
**Anmerkung:** Der C++-Code innerhalb der `
`-Tags wurde gemäß den Anweisungen nicht übersetzt, da er Code darstellt. Die HTML-Struktur und Attribute bleiben ebenfalls unverändert.

Klasse std::ranges::elements_of

namespace std::ranges {
  template<range R, class Allocator = allocator<byte>>
  struct elements_of
  {
    [[no_unique_address]] R range;
    [[no_unique_address]] Allocator allocator = Allocator();
  };
  template<class R, class Allocator = allocator<byte>>
  elements_of(R&&, Allocator = Allocator()) -> elements_of<R&&, Allocator>;
}
**Anmerkung:** Der gesamte Code innerhalb der `
`-Tags wurde gemäß den Anweisungen nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Struktur und Formatierung bleiben vollständig erhalten.

Klassentemplate std::ranges::empty_view

namespace std::ranges {
  template<class T>
    requires is_object_v<T>
  class empty_view : public view_interface<empty_view<T>>
  {
  public:
    static constexpr T* begin() noexcept { return nullptr; }
    static constexpr T* end() noexcept { return nullptr; }
    static constexpr T* data() noexcept { return nullptr; }
    static constexpr size_t size() noexcept { return 0; }
    static constexpr bool empty() noexcept { return true; }
  };
}

Klassentemplate std::ranges::single_view

namespace std::ranges {
  template<move_constructible T>
    requires is_object_v<T>
  class single_view : public view_interface<single_view<T>>
  {
  private:
    /*movable-box*/<T> /*value_*/; // nur zur Darstellung
  public:
    single_view()
      requires default_initializable<T>
    = default;
    constexpr explicit single_view(const T& t)
      requires copy_constructible<T>;
    constexpr explicit single_view(T&& t);
    template<class... Args>
      requires constructible_from<T, Args...>
    constexpr explicit single_view(in_place_t, Args&&... args);
    constexpr T* begin() noexcept;
    constexpr const T* begin() const noexcept;
    constexpr T* end() noexcept;
    constexpr const T* end() const noexcept;
    static constexpr bool empty() noexcept;
    static constexpr size_t size() noexcept;
    constexpr T* data() noexcept;
    constexpr const T* data() const noexcept;
  };
  template<class T>
  single_view(T) -> single_view<T>;
}

Klassentemplate std::ranges::iota_view

namespace std::ranges {
  template<class I>
  concept /*decrementable*/ = /* siehe Beschreibung */; // nur zur Darstellung
  template<class I>
  concept /*advanceable*/ = /* siehe Beschreibung */; // nur zur Darstellung
  template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t>
    requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W>
  class iota_view : public view_interface<iota_view<W, Bound>>
  {
  private:
    // Klasse iota_view::iterator
    struct /*iterator*/; // nur zur Darstellung
    // Klasse iota_view::sentinel
    struct /*sentinel*/; // nur zur Darstellung
    W /*value_*/     = W();     // nur zur Darstellung
    Bound /*bound_*/ = Bound(); // nur zur Darstellung
  public:
    iota_view()
      requires default_initializable<W>
    = default;
    constexpr explicit iota_view(W value);
    constexpr explicit iota_view(type_identity_t<W> value, type_identity_t<Bound> bound);
    constexpr explicit iota_view(/*iterator*/ first, /* siehe Beschreibung */ last);
    constexpr /*iterator*/ begin() const;
    constexpr auto end() const;
    constexpr /*iterator*/ end() const
      requires same_as<W, Bound>;
    constexpr bool empty() const;
    constexpr auto size() const
      requires /* siehe Beschreibung */;
  };
  template<class W, class Bound>
    requires(!/*is-integer-like*/<W> || !/*is-integer-like*/<Bound> ||
             (/*is-signed-integer-like*/<W> == /*is-signed-integer-like*/<Bound>))
  iota_view(W, Bound) -> iota_view<W, Bound>;
}

Klassentemplate std::ranges::iota_view::iterator

namespace std::ranges {
  template<weakly_incrementable W, semiregular Bound>
    requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W>
  struct iota_view<W, Bound>::/*iterator*/
  {
  private:
    W /*value_*/ = W(); // nur zur Darstellung
  public:
    using iterator_concept = /* siehe Beschreibung */;
    using iterator_category =
      input_iterator_tag; // nur vorhanden, wenn W incrementable modelliert und
                          // IOTA-DIFF-T(W) ein integraler Typ ist
    using value_type      = W;
    using difference_type = /*IOTA-DIFF-T*/(W);
    /*iterator*/()
      requires default_initializable<W>
    = default;
    constexpr explicit /*iterator*/(W value);
    constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>);
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires incrementable<W>;
    constexpr /*iterator*/& operator--()
      requires /*decrementable*/<W>;
    constexpr /*iterator*/ operator--(int)
      requires /*decrementable*/<W>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires /*advanceable*/<W>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires /*advanceable*/<W>;
    constexpr W operator[](difference_type n) const
      requires /*advanceable*/<W>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<W>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires totally_ordered<W>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires totally_ordered<W>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires totally_ordered<W>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires totally_ordered<W>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires totally_ordered<W> && three_way_comparable<W>;
    friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n)
      requires /*advanceable*/<W>;
    friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i)
      requires /*advanceable*/<W>;
    friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n)
      requires /*advanceable*/<W>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires /*advanceable*/<W>;
  };
}

Klassentemplate std::ranges::iota_view::sentinel

namespace std::ranges {
  template<weakly_incrementable W, semiregular Bound>
    requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W>
  struct iota_view<W, Bound>::/*sentinel*/
  {
  private:
    Bound /*bound_*/ = Bound(); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(Bound bound);
    friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y);
    friend constexpr iter_difference_t<W> operator-(const /*iterator*/& x,
                                                    const /*sentinel*/& y)
      requires sized_sentinel_for<Bound, W>;
    friend constexpr iter_difference_t<W> operator-(const /*sentinel*/& x,
                                                    const /*iterator*/& y)
      requires sized_sentinel_for<Bound, W>;
  };
}

Klassentemplate std::ranges::repeat_view

namespace std::ranges {
  template<class T>
  concept /*integer-like-with-usable-difference-type*/ = // Nur zur Darstellung
    /*is-signed-integer-like*/<T> || (/*is-integer-like*/<T> && weakly_incrementable<T>);
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
    requires(is_object_v<T> && same_as<T, remove_cv_t<T>> &&
             (/*integer-like-with-usable-difference-type*/<Bound> ||
              same_as<Bound, unreachable_sentinel_t>))
  class repeat_view : public view_interface<repeat_view<T, Bound>>
  {
  private:
    // Klasse repeat_view::iterator
    struct /*iterator*/; // Nur zur Darstellung
    /*movable-box*/<T> /*value_*/; // Nur zur Darstellung
    Bound /*bound_*/ = Bound();    // Nur zur Darstellung
  public:
    repeat_view()
      requires default_initializable<T>
    = default;
    constexpr explicit repeat_view(const T& value, Bound bound = Bound())
      requires copy_constructible<T>;
    constexpr explicit repeat_view(T&& value, Bound bound = Bound());
    template<class... TArgs, class... BoundArgs>
      requires constructible_from<T, TArgs...> && constructible_from<Bound, BoundArgs...>
    constexpr explicit repeat_view(piecewise_construct_t,
                                   tuple<TArgs...> value_args,
                                   tuple<BoundArgs...> bound_args = tuple<>{});
    constexpr /*iterator*/ begin() const;
    constexpr /*iterator*/ end() const
      requires(!same_as<Bound, unreachable_sentinel_t>);
    constexpr unreachable_sentinel_t end() const noexcept;
    constexpr auto size() const
      requires(!same_as<Bound, unreachable_sentinel_t>);
  };
  template<class T, class Bound = unreachable_sentinel_t>
  repeat_view(T, Bound = Bound()) -> repeat_view<T, Bound>;
}

Klassentemplate std::ranges::repeat_view::iterator

namespace std::ranges {
  template<move_constructible T, semiregular Bound>
    requires(is_object_v<T> && same_as<T, remove_cv_t<T>> &&
             (/*integer-like-with-usable-difference-type*/<Bound> ||
              same_as<Bound, unreachable_sentinel_t>))
  class repeat_view<T, Bound>::/*iterator*/
  {
  private:
    using /*index-type*/ = // nur zur Darstellung
      conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>;
    const T* /*value_*/         = nullptr;          // nur zur Darstellung
    /*index-type*/ /*current_*/ = /*index-type*/(); // nur zur Darstellung
    constexpr explicit /*iterator*/(
      const T* value,
      /*index-type*/ b = /*index-type*/()); // nur zur Darstellung
  public:
    using iterator_concept  = random_access_iterator_tag;
    using iterator_category = random_access_iterator_tag;
    using value_type        = T;
    using difference_type   = /* siehe Beschreibung */;
    /*iterator*/()          = default;
    constexpr const T& operator*() const noexcept;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--();
    constexpr /*iterator*/ operator--(int);
    constexpr /*iterator*/& operator+=(difference_type n);
    constexpr /*iterator*/& operator-=(difference_type n);
    constexpr const T& operator[](difference_type n) const noexcept;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n);
    friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i);
    friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n);
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y);
  };
}

Klassentemplate std::ranges::basic_istream_view

namespace std::ranges {
  template<class Val, class CharT, class Traits>
  concept /*stream-extractable*/ = // nur zur Darstellung
    requires(basic_istream<CharT, Traits>& is, Val& t) { is >> t; };
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
    requires default_initializable<Val> && /*stream-extractable*/<Val, CharT, Traits>
  class basic_istream_view : public view_interface<basic_istream_view<Val, CharT, Traits>>
  {
  public:
    constexpr explicit basic_istream_view(basic_istream<CharT, Traits>& stream);
    constexpr auto begin()
    {
      */*stream_*/ >> /*value_*/;
      return /*iterator*/{ *this };
    }
    constexpr default_sentinel_t end() const noexcept;
  private:
    // Klasse basic_istream_view::iterator
    struct /*iterator*/;                       // nur zur Darstellung
    basic_istream<CharT, Traits>* /*stream_*/; // nur zur Darstellung
    Val /*value_*/ = Val();                    // nur zur Darstellung
  };
}

Klassentemplate std::ranges::basic_istream_view::iterator

namespace std::ranges {
  template<movable Val, class CharT, class Traits>
    requires default_initializable<Val> && /*stream-extractable*/<Val, CharT, Traits>
  class basic_istream_view<Val, CharT, Traits>::/*iterator*/
  {
  public:
    using iterator_concept = input_iterator_tag;
    using difference_type  = ptrdiff_t;
    using value_type       = Val;
    constexpr explicit /*iterator*/(basic_istream_view& parent) noexcept;
    /*iterator*/(const /*iterator*/&)            = delete;
    /*iterator*/(/*iterator*/&&)                 = default;
    /*iterator*/& operator=(const /*iterator*/&) = delete;
    /*iterator*/& operator=(/*iterator*/&&)      = default;
    /*iterator*/& operator++();
    void operator++(int);
    Val& operator*() const;
    friend bool operator==(const /*iterator*/& x, default_sentinel_t);
  private:
    basic_istream_view* /*parent_*/; // nur zur Darstellung
  };
}

Klassentemplate std::ranges::ref_view

namespace std::ranges {
  template<range R>
    requires is_object_v<R>
  class ref_view : public view_interface<ref_view<R>>
  {
  private:
    R* /*r_*/; // nur zur Darstellung
  public:
    template</*different-from*/<ref_view> T>
      requires /* siehe Beschreibung */
      constexpr
    ref_view(T&& t);
    constexpr R& base() const { return */*r_*/; }
    constexpr iterator_t<R> begin() const { return ranges::begin(*/*r_*/); }
    constexpr sentinel_t<R> end() const { return ranges::end(*/*r_*/); }
    constexpr bool empty() const
      requires requires { ranges::empty(*/*r_*/); }
    {
      return ranges::empty(*/*r_*/);
    }
    constexpr auto size() const
      requires sized_range<R>
    {
      return ranges::size(*/*r_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<R>
    {
      return ranges::reserve_hint(*/*r_*/);
    }
    constexpr auto data() const
      requires contiguous_range<R>
    {
      return ranges::data(*/*r_*/);
    }
  };
  template<class R>
  ref_view(R&) -> ref_view<R>;
}

Klassentemplate std::ranges::owning_view

namespace std::ranges {
  template<range R>
    requires movable<R> && (!/*is-initializer-list*/<R>)
  class owning_view : public view_interface<owning_view<R>>
  {
  private:
    R /*r_*/ = R(); // nur zur Darstellung
  public:
    owning_view()
      requires default_initializable<R>
    = default;
    constexpr owning_view(R&& t);
    owning_view(owning_view&&)            = default;
    owning_view& operator=(owning_view&&) = default;
    constexpr R& base() & noexcept { return /*r_*/; }
    constexpr const R& base() const& noexcept { return /*r_*/; }
    constexpr R&& base() && noexcept { return std::move(/*r_*/); }
    constexpr const R&& base() const&& noexcept { return std::move(/*r_*/); }
    constexpr iterator_t<R> begin() { return ranges::begin(/*r_*/); }
    constexpr sentinel_t<R> end() { return ranges::end(/*r_*/); }
    constexpr auto begin() const
      requires range<const R>
    {
      return ranges::begin(/*r_*/);
    }
    constexpr auto end() const
      requires range<const R>
    {
      return ranges::end(/*r_*/);
    }
    constexpr bool empty()
      requires requires { ranges::empty(/*r_*/); }
    {
      return ranges::empty(/*r_*/);
    }
    constexpr bool empty() const
      requires requires { ranges::empty(/*r_*/); }
    {
      return ranges::empty(/*r_*/);
    }
    constexpr auto size()
      requires sized_range<R>
    {
      return ranges::size(/*r_*/);
    }
    constexpr auto size() const
      requires sized_range<const R>
    {
      return ranges::size(/*r_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<R>
    {
      return ranges::reserve_hint(/*r_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const R>
    {
      return ranges::reserve_hint(/*r_*/);
    }
    constexpr auto data()
      requires contiguous_range<R>
    {
      return ranges::data(/*r_*/);
    }
    constexpr auto data() const
      requires contiguous_range<const R>
    {
      return ranges::data(/*r_*/);
    }
  };
}

Klassentemplate std::ranges::as_rvalue_view

namespace std::ranges {
  template<view V>
    requires input_range<V>
  class as_rvalue_view : public view_interface<as_rvalue_view<V>>
  {
    V /*base_*/ = V(); // nur zur Darstellung
  public:
    as_rvalue_view()
      requires default_initializable<V>
    = default;
    constexpr explicit as_rvalue_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return move_iterator(ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return move_iterator(ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (common_range<V>) {
        return move_iterator(ranges::end(/*base_*/));
      } else {
        return move_sentinel(ranges::end(/*base_*/));
      }
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (common_range<const V>) {
        return move_iterator(ranges::end(/*base_*/));
      } else {
        return move_sentinel(ranges::end(/*base_*/));
      }
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  };
  template<class R>
  as_rvalue_view(R&&) -> as_rvalue_view<views::all_t<R>>;
}

Klassentemplate std::ranges::filter_view

namespace std::ranges {
  template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class filter_view : public view_interface<filter_view<V, Pred>>
  {
  private:
    V /*base_*/ = V();               // nur zur Darstellung
    /*movable-box*/<Pred> /*pred_*/; // nur zur Darstellung
    // Klasse filter_view::iterator
    class /*iterator*/; // nur zur Darstellung
    // Klasse filter_view::sentinel
    class /*sentinel*/; // nur zur Darstellung
  public:
    filter_view()
      requires default_initializable<V> && default_initializable<Pred>
    = default;
    constexpr explicit filter_view(V base, Pred pred);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr const Pred& pred() const;
    constexpr /*iterator*/ begin();
    constexpr auto end()
    {
      if constexpr (common_range<V>)
        return /*iterator*/{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/{ *this };
    }
  };
  template<class R, class Pred>
  filter_view(R&&, Pred) -> filter_view<views::all_t<R>, Pred>;
}

Klassentemplate std::ranges::filter_view::iterator

namespace std::ranges {
  template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class filter_view<V, Pred>::/*iterator*/
  {
  private:
    iterator_t<V> /*current_*/ = iterator_t<V>(); // nur zur Darstellung
    filter_view* /*parent_*/   = nullptr;         // nur zur Darstellung
  public:
    using iterator_concept  = /* siehe Beschreibung */;
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using value_type        = range_value_t<V>;
    using difference_type   = range_difference_t<V>;
    /*iterator*/()
      requires default_initializable<iterator_t<V>>
    = default;
    constexpr /*iterator*/(filter_view& parent, iterator_t<V> current);
    constexpr const iterator_t<V>& base() const& noexcept;
    constexpr iterator_t<V> base() &&;
    constexpr range_reference_t<V> operator*() const;
    constexpr iterator_t<V> operator->() const
      requires /*has-arrow*/<iterator_t<V>> && copyable<iterator_t<V>>;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range<V>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range<V>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range<V>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t<V>>;
    friend constexpr range_rvalue_reference_t<V> iter_move(
      const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/)));
    friend constexpr void iter_swap(
      const /*iterator*/& x,
      const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/,
                                                                 y./*current_*/)))
      requires indirectly_swappable<iterator_t<V>>;
  };
}

Klassentemplate std::ranges::filter_view::sentinel

namespace std::ranges {
  template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class filter_view<V, Pred>::/*sentinel*/
  {
  private:
    sentinel_t<V> /*end_*/ = sentinel_t<V>(); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(filter_view& parent);
    constexpr sentinel_t<V> base() const;
    friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y);
  };
}

Klassentemplate std::ranges::transform_view

namespace std::ranges {
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*can-reference*/<invoke_result_t<F&, range_reference_t<V>>>
  class transform_view : public view_interface<transform_view<V, F>>
  {
  private:
    // Klassen-Template transform_view::iterator
    template<bool>
    struct /*iterator*/; // nur zur Darstellung
    // Klassen-Template transform_view::sentinel
    template<bool>
    struct /*sentinel*/; // nur zur Darstellung
    V /*base_*/ = V();           // nur zur Darstellung
    /*movable-box*/<F> /*fun_*/; // nur zur Darstellung
  public:
    transform_view()
      requires default_initializable<V> && default_initializable<F>
    = default;
    constexpr explicit transform_view(V base, F fun);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr /*iterator*/<false> begin();
    constexpr /*iterator*/<true> begin() const
      requires range<const V> && regular_invocable<const F&, range_reference_t<const V>>;
    constexpr /*sentinel*/<false> end();
    constexpr /*iterator*/<false> end()
      requires common_range<V>;
    constexpr /*sentinel*/<true> end() const
      requires range<const V> && regular_invocable<const F&, range_reference_t<const V>>;
    constexpr /*iterator*/<true> end() const
      requires common_range<const V> &&
               regular_invocable<const F&, range_reference_t<const V>>;
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  };
  template<class R, class F>
  transform_view(R&&, F) -> transform_view<views::all_t<R>, F>;
}

Klassentemplate std::ranges::transform_view::iterator

namespace std::ranges {
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*kann-referenziert-werden*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*iterator*/
  {
  private:
    using /*Elternklasse*/ = /*vielleicht-konst*/<Const, transform_view>;  // exposition-only
    using /*Basis*/   = /*vielleicht-konst*/<Const, V>;               // exposition-only
    iterator_t</*Basis*/> /*current_*/ = iterator_t</*Basis*/>(); // exposition-only
    /*Elternklasse*/* /*parent_*/           = nullptr;                // exposition-only
  public:
    using iterator_concept  = /* siehe Beschreibung */;
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using value_type        = remove_cvref_t<
      invoke_result_t</*vielleicht-konst*/<Const, F>&, range_reference_t</*Basis*/>>>;
    using difference_type = range_difference_t</*Basis*/>;
    /*iterator*/()
      requires default_initializable<iterator_t</*Basis*/>>
    = default;
    constexpr /*iterator*/(/*Eltern*/& parent, iterator_t</*Basis*/> current);
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>>;
    constexpr const iterator_t</*Basis*/>& base() const& noexcept;
    constexpr iterator_t</*Basis*/> base() &&;
    constexpr decltype(auto) operator*() const
      noexcept(noexcept(invoke(*/*parent_*/->/*fun_*/, */*current_*/)))
    {
      return invoke(*/*parent_*/->/*fun_*/, */*aktuell_*/);
    }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Basis*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires random_access_range</*Basis*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Basis*/>
    {
      return invoke(*/*parent_*/->/*fun_*/, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*Basis*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> && three_way_comparable<iterator_t</*Basis*/>>
    ;
    friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Basis*/>, iterator_t</*Basis*/>>;
  };
}

Klassentemplate std::ranges::transform_view::sentinel

namespace std::ranges {
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*can-reference*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*sentinel*/
  {
  private:
    using /*Parent*/ = /*maybe-const*/<Const, transform_view>; // nur zur Darstellung
    using /*Base*/   = /*maybe-const*/<Const, V>;              // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end);
    constexpr /*sentinel*/(/*sentinel*/<!Const> i)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr sentinel_t</*Base*/> base() const;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*iterator*/<OtherConst>& x,
      const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*sentinel*/& y,
      const /*iterator*/<OtherConst>& x);
  };
}

Klassentemplate std::ranges::take_view

namespace std::ranges {
  template<view V>
  class take_view : public view_interface<take_view<V>>
  {
  private:
    V /*base_*/                      = V(); // exposition-only
    range_difference_t<V> /*count_*/ = 0;   // exposition-only
    // Klassentemplate take_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    take_view()
      requires default_initializable<V>
    = default;
    constexpr explicit take_view(V base, range_difference_t<V> count);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (sized_range<V>) {
        if constexpr (random_access_range<V>) {
          return ranges::begin(/*base_*/);
        } else {
          auto sz = range_difference_t<V>(size());
          return counted_iterator(ranges::begin(/*base_*/), sz);
        }
      } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) {
        auto it = ranges::begin(/*base_*/);
        auto sz = std::min(/*count_*/, ranges::end(/*base_*/) - it);
        return counted_iterator(std::move(it), sz);
      } else {
        return counted_iterator(ranges::begin(/*base_*/), /*count_*/);
      }
    }
    constexpr auto begin() const
      requires range<const V>
    {
      if constexpr (sized_range<const V>) {
        if constexpr (random_access_range<const V>) {
          return ranges::begin(/*base_*/);
        } else {
          auto sz = range_difference_t<const V>(size());
          return counted_iterator(ranges::begin(/*base_*/), sz);
        }
      } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
        auto it = ranges::begin(/*base_*/);
        auto sz = std::min(/*count_*/, ranges::end(/*base_*/) - it);
        return counted_iterator(std::move(it), sz);
      } else {
        return counted_iterator(ranges::begin(/*base_*/), /*count_*/);
      }
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (sized_range<V>) {
        if constexpr (random_access_range<V>)
          return ranges::begin(/*base_*/) + range_difference_t<V>(size());
        else
          return default_sentinel;
      } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) {
        return default_sentinel;
      } else {
        return /*sentinel*/<false>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (sized_range<const V>) {
        if constexpr (random_access_range<const V>)
          return ranges::begin(/*base_*/) + range_difference_t<const V>(size());
        else
          return default_sentinel;
      } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
        return default_sentinel;
      } else {
        return /*sentinel*/<true>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto size()
      requires sized_range<V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*count_*/));
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*count_*/));
    }
    constexpr auto reserve_hint()
    {
      if constexpr (approximately_sized_range<V>) {
        auto n = static_cast<range_difference_t<V>>(ranges::reserve_hint(/*base_*/));
        return /*to-unsigned-like*/(ranges::min(n, /*count_*/));
      }
      return /*to-unsigned-like*/(/*count_*/);
    }
    constexpr auto reserve_hint() const
    {
      if constexpr (approximately_sized_range<const V>) {
        auto n =
          static_cast<range_difference_t<const V>>(ranges::reserve_hint(/*base_*/));
        return /*to-unsigned-like*/(ranges::min(n, /*count_*/));
      }
      return /*to-unsigned-like*/(/*count_*/);
    }
  };
  template<class R>
  take_view(R&&, range_difference_t<R>) -> take_view<views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde originalgetreu erhalten
- Der Text innerhalb der Tags wurde gemäß den Anforderungen nicht übersetzt<R>>;
}

Klassentemplate std::ranges::take_view::sentinel

namespace std::ranges {
  template<view V>
  template<bool Const>
  class take_view<V>::/*sentinel*/
  {
  private:
    using /*Base*/ = /*maybe-const*/<Const, V>; // nur zur Darstellung
    template<bool OtherConst>
    using /*CI*/ =
      counted_iterator<iterator_t</*maybe-const*/<OtherConst, V>>>; // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();         // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end);
    constexpr /*sentinel*/(/*sentinel*/<!Const> s)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr sentinel_t</*Base*/> base() const;
    friend constexpr bool operator==(const /*CI*/<Const>& y, const /*sentinel*/& x);
    template<bool OtherConst = !Const>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*CI*/<OtherConst>& y, const /*sentinel*/& x);
  };
}

Klassentemplate std::ranges::take_while_view

namespace std::ranges {
  template<view V, class Pred>
    requires input_range<V> && is_object_v<Pred> &&
             indirect_unary_predicate<const Pred, iterator_t<V>>
  class take_while_view : public view_interface<take_while_view<V, Pred>>
  {
    // Klassen-Template take_while_view::sentinel
    template<bool>
    class /*sentinel*/; // nur zur Darstellung
    V /*base_*/ = V();               // nur zur Darstellung
    /*movable-box*/<Pred> /*pred_*/; // nur zur Darstellung
  public:
    take_while_view()
      requires default_initializable<V> && default_initializable<Pred>
    = default;
    constexpr explicit take_while_view(V base, Pred pred);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr const Pred& pred() const;
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return ranges::begin(/*base_*/);
    }
    constexpr auto begin() const
      requires range<const V> && indirect_unary_predicate<const Pred, iterator_t<const V>>
    {
      return ranges::begin(/*base_*/);
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      return /*sentinel*/<false>(ranges::end(/*base_*/), addressof(*/*pred_*/));
    }
    constexpr auto end() const
      requires range<const V> && indirect_unary_predicate<const Pred, iterator_t<const V>>
    {
      return /*sentinel*/<true>(ranges::end(/*base_*/), addressof(*/*pred_*/));
    }
  };
  template<class R, class Pred>
  take_while_view(R&&, Pred) -> take_while_view<views::all_t<R>, Pred>;
}

Klassentemplate std::ranges::take_while_view::sentinel

namespace std::ranges {
  template<view V, class Pred>
    requires input_range<V> && is_object_v<Pred> &&
             indirect_unary_predicate<const Pred, iterator_t<V>>
  template<bool Const>
  class take_while_view<V, Pred>::/*sentinel*/
  {
    using /*Base*/                = /*maybe-const*/<Const, V>; // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // nur zur Darstellung
    const Pred* /*pred_*/         = nullptr;                // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end, const Pred* pred);
    constexpr /*sentinel*/(/*sentinel*/<!Const> s)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr sentinel_t</*Base*/> base() const { return /*end_*/; }
    friend constexpr bool operator==(const iterator_t</*Base*/>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst = !Const>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const iterator_t</*maybe-const*/<OtherConst, V>>& x,
                                     const /*sentinel*/& y);
  };
}

Klassentemplate std::ranges::drop_view

namespace std::ranges {
  template<view V>
  class drop_view : public view_interface<drop_view<V>>
  {
  public:
    drop_view()
      requires default_initializable<V>
    = default;
    constexpr explicit drop_view(V base, range_difference_t<V> count);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!(/*simple-view*/<V> && random_access_range<const V> &&
                 sized_range<const V>));
    constexpr auto begin() const
      requires random_access_range<const V> && sized_range<const V>;
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      return ranges::end(/*base_*/);
    }
    constexpr auto end() const
      requires range<const V>
    {
      return ranges::end(/*base_*/);
    }
    constexpr auto size()
      requires sized_range<V>
    {
      const auto s = ranges::size(/*base_*/);
      const auto c = static_cast<decltype(s)>(/*count_*/);
      return s < c ? 0 : s - c;
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      const auto s = ranges::size(/*base_*/);
      const auto c = static_cast<decltype(s)>(/*count_*/);
      return s < c ? 0 : s - c;
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      const auto s = static_cast<range_difference_t<V>>(ranges::reserve_hint(/*base_*/));
      return /*to-unsigned-like*/(s < /*count_*/ ? 0 : s - /*count_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      const auto s =
        static_cast<range_difference_t<const V>>(ranges::reserve_hint(/*base_*/));
      return /*to-unsigned-like*/(s < /*count_*/ ? 0 : s - /*count_*/);
    }
  private:
    V /*base_*/                      = V(); // nur zur Veranschaulichung
    range_difference_t<V> /*count_*/ = 0;   // nur zur Veranschaulichung
  };
  template<class R>
  drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;
}

Klassentemplate std::ranges::drop_while_view

namespace std::ranges {
  template<view V, class Pred>
    requires input_range<V> && is_object_v<Pred> &&
             indirect_unary_predicate<const Pred, iterator_t<V>>
  class drop_while_view : public view_interface<drop_while_view<V, Pred>>
  {
  public:
    drop_while_view()
      requires default_initializable<V> && default_initializable<Pred>
    = default;
    constexpr explicit drop_while_view(V base, Pred pred);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr const Pred& pred() const;
    constexpr auto begin();
    constexpr auto end() { return ranges::end(/*base_*/); }
  private:
    V /*base_*/ = V();               // nur zur Darstellung
    /*movable-box*/<Pred> /*pred_*/; // nur zur Darstellung
  };
  template<class R, class Pred>
  drop_while_view(R&&, Pred) -> drop_while_view<views::all_t<R>, Pred>;
}

Klassentemplate std::ranges::join_view

namespace std::ranges {
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view : public view_interface<join_view<V>>
  {
  private:
    using /*InnerRng*/ = range_reference_t<V>; // exposition-only
    // Klassentemplate join_view::iterator
    template<bool Const>
    struct /*iterator*/; // exposition-only
    // Klassen-Template join_view::sentinel
    template<bool Const>
    struct /*sentinel*/; // exposition-only
    V /*base_*/ = V(); // exposition-only
    /*nicht-verbreitender-Cache*/<iterator_t<V>> /*outer_*/; // exposition-only present only
                                                         // when !forward_range<V>
    /*nicht-verbreitender-Cache*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/; // exposition-only present only
                  // if is_reference_v<InnerRng> is false
  public:
    join_view()
      requires default_initializable<V>
    = default;
    constexpr explicit join_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        constexpr bool use_const = /*simple-view*/<V> && is_reference_v</*InnerRng*/>;
        return /*iterator*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer_*/ = ranges::begin(/*base_*/);
        return /*iterator*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>>
    {
      return /*iterator*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
    {
      if constexpr (forward_range<V> && is_reference_v</*InnerRng*/> &&
                    forward_range</*InnerRng*/> && common_range<V> &&
                    common_range</*InnerRng*/>)
        return /*iterator*/</*simple-view*/<V>>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/</*simple-view*/<V>>{ *this };
    }
    constexpr auto end() const
      requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>>
    {
      if constexpr (forward_range<range_reference_t<const V>> && common_range<const V> &&
                    common_range<range_reference_t<const V>>)
        return /*iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/<true>{ *this };
    }
  };
  template<class R>
  explicit join_view(R&&) -> join_view<views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde exakt erhalten
- Die Übersetzung folgt professionellen Standards für technische Dokumentation<R>>;
}

Klassentemplate std::ranges::join_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  template<bool Const>
  struct join_view<V>::/*iterator*/
  {
  private:
    using /*Parent*/    = /*vielleicht-konst*/<Const, join_view>;       // exposition-only
    using /*Basis*/      = /*vielleicht-konst*/<Const, V>;               // exposition-only
    using /*OuterIter*/ = iterator_t</*Basis*/>;                    // exposition-only
    using /*InnerIter*/ = iterator_t<range_reference_t</*Basis*/>>; // exposition-only
    static constexpr bool /*ref-is-glvalue*/ = // exposition-only
      is_reference_v<range_reference_t</*Basis*/>>;
    /*OuterIter*/ /*outer_*/ = /*OuterIter*/(); // exposition-only present only
                                                // wenn Base forward_range modelliert
    optional</*InnerIter*/> /*inner_*/;         // exposition-only
    /*Parent*/* /*parent_*/ = nullptr;          // exposition-only
    constexpr void /*erfüllen*/(); // exposition-only
    constexpr /*OuterIter*/& /*outer*/();             // exposition-only
    constexpr const /*OuterIter*/& /*outer*/() const; // exposition-only
    constexpr /*iterator*/(/*Eltern*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Basis*/>; // exposition-only
    constexpr explicit /*iterator*/(/*Parent*/& parent)
      requires(!forward_range</*Basis*/>); // exposition-only
  public:
    using iterator_concept  = /* siehe Beschreibung */;
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using value_type        = range_value_t<range_reference_t</*Basis*/>>;
    using difference_type   = /* siehe Beschreibung */;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, /*OuterIter*/> &&
               convertible_to<iterator_t</*InnerRng*/>, /*InnerIter*/>;
    constexpr decltype(auto) operator*() const { return **/*inner_*/; }
    constexpr /*InnerIter*/ operator->() const
      requires /*Pfeil vorhanden*/</*InnerIter*/> && copyable</*InnerIter*/>;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*ref-is-glvalue*/
               && forward_range</*Basis*/> && forward_range<range_reference_t</*Basis*/>>;
    constexpr /*iterator*/& operator--()
      requires /*ref-is-glvalue*/ && bidirectional_range</*Basis*/> &&
               bidirectional_range<range_reference_t</*Basis*/>> &&
               common_range<range_reference_t</*Basis*/>>;
    constexpr /*iterator*/ operator--(int)
      requires /*ref-is-glvalue*/ && bidirectional_range</*Basis*/> &&
               bidirectional_range<range_reference_t</*Basis*/>> &&
               common_range<range_reference_t</*Basis*/>>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires /*ref-is-glvalue*/ && forward_range</*Basis*/> &&
               equality_comparable<iterator_t<range_reference_t</*Basis*/>>>;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& i) noexcept(
      noexcept(ranges::iter_move(*i./*inner_*/)))
    {
      return ranges::iter_move(*i./*inner_*/);
    }
    friend constexpr void iter_swap(
      const /*iterator*/& x,
      const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(*x./*inner_*/,
                                                                 *y./*inner_*/)))
      requires indirectly_swappable</*InnerIter*/>;
  };
}

Klassentemplate std::ranges::join_view::sentinel

namespace std::ranges {
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  template<bool Const>
  struct join_view<V>::/*sentinel*/
  {
  private:
    using /*Parent*/              = /*maybe-const*/<Const, join_view>; // nur zur Darstellung
    using /*Base*/                = /*maybe-const*/<Const, V>;         // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();            // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(/*Parent*/& parent);
    constexpr /*sentinel*/(/*sentinel*/<!Const> s)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
  };
}

Klassentemplate std::ranges::join_with_view

namespace std::ranges {
  template<class R>
  concept /*bidirektional-allgemein*/ =
    bidirectional_range<R> && common_range<R>; // exposition-only
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>> && view<Pattern> &&
             /*verknüpfbar*/<range_reference_t<V>, Pattern>
  class join_with_view : public view_interface<join_with_view<V, Pattern>>
  {
    using /*InnerRng*/ = range_reference_t<V>; // exposition-only
    V /*base_*/        = V();                               // exposition-only
    /*nicht-verbreitender-Cache*/<iterator_t<V>> /*outer-it_*/; // nur zur Darstellung vorhanden
                                                            // nur wenn !forward_range<V>
    /*nicht-verbreitender-Cache*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/;                     // exposition-only present only
                                      // if is_reference_v<InnerRng> is false
    Pattern /*Muster_*/ = Pattern(); // exposition-only
    // class template join_with_view::iterator
    template<bool Const>
    struct /*iterator*/; // exposition-only
    // class template join_with_view::sentinel
    template<bool Const>
    struct /*sentinel*/; // exposition-only
  public:
    join_with_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit join_with_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde originalgetreu erhalten
- Der Link-Pfad `../ranges/all_view.html` bleibt unverändert<R>> &&
               constructible_from<Pattern, single_view<range_value_t</*InnerRng*/>>>
    constexpr explicit join_with_view(R&& r, range_value_t</*InnerRng*/> e);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        constexpr bool use_const =
          /*simple-view*/<V> && is_reference_v</*InnerRng*/> && /*simple-view*/<Pattern>;
        return /*iterator*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer-it_*/ = ranges::begin(/*base_*/);
        return /*iterator*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<const V> && forward_range<const Pattern> &&
               is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>> &&
               /*verknüpfbar*/<range_reference_t<const V>, const Pattern>
    {
      return /*iterator*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
    {
      if constexpr (forward_range<V> && is_reference_v</*InnerRng*/> &&
                    forward_range</*InnerRng*/> && common_range<V> &&
                    common_range</*InnerRng*/>)
        return /*iterator*/ < /*simple-view*/<V> &&
               /*simple-view*/ < Pattern >> { *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/ < /*simple-view*/<V> &&
               /*simple-view*/ < Pattern >> { *this };
    }
    constexpr auto end() const
      requires forward_range<const V> && forward_range<const Pattern> &&
               is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>> &&
               /*verknüpfbar*/<range_reference_t<const V>, const Pattern>
    {
      using InnerConstRng = range_reference_t<const V>;
      if constexpr (forward_range<InnerConstRng> && common_range<const V> &&
                    common_range<InnerConstRng>)
        return /*iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/<true>{ *this };
    }
  };
  template<class R, class P>
  join_with_view(R&&, P&&) -> join_with_view<views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde originalgetreu erhalten
- Der Link-Pfad `../ranges/all_view.html` bleibt unverändert<R>, views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde originalgetreu erhalten
- Der Link-Pfad `../ranges/all_view.html` bleibt unverändert<P>>;
  template<input_range R>
  join_with_view(R&&, range_value_t<range_reference_t<R>>)
    -> join_with_view<views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde originalgetreu erhalten
- Der Link-Pfad `../ranges/all_view.html` bleibt unverändert<R>, single_view<range_value_t<range_reference_t<R>>>>;
}

Klassentemplate std::ranges::join_with_view::iterator

namespace std::ranges {
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>> && view<Pattern> &&
             /*verknüpfbar*/<range_reference_t<V>, Pattern>
  template<bool Const>
  class join_with_view<V, Pattern>::/*iterator*/
  {
    using /*Parent*/      = /*vielleicht-konst*/<Const, join_with_view>; // exposition-only
    using /*Basis*/        = /*vielleicht-konst*/<Const, V>;              // exposition-only
    using /*InnerBase*/   = range_reference_t</*Basis*/>;            // exposition-only
    using /*PatternBase*/ = /*vielleicht-konst*/<Const, Pattern>;        // exposition-only
    using /*OuterIter*/   = iterator_t</*Basis*/>;        // exposition-only
    using /*InnerIter*/   = iterator_t</*InnerBase*/>;   // exposition-only
    using /*PatternIter*/ = iterator_t</*PatternBase*/>; // exposition-only
    static constexpr bool /*ref-is-glvalue*/ =
      is_reference_v</*InnerBase*/>; // exposition-only
    /*Parent*/* /*parent_*/     = nullptr;                 // exposition-only
    /*OuterIter*/ /*outer-it_*/ = /*OuterIter*/();         // exposition-only present only
                                                           // wenn Base forward_range modelliert
    variant</*PatternIter*/, /*InnerIter*/> /*inner-it_*/; // exposition-only
    constexpr /*iterator*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Basis*/>; // exposition-only
    constexpr explicit /*iterator*/(/*Parent*/& parent)
      requires(!forward_range</*Basis*/>);             // exposition-only
    constexpr /*OuterIter*/& /*outer*/();             // exposition-only
    constexpr const /*OuterIter*/& /*outer*/() const; // exposition-only
    constexpr auto& /*update-inner*/();               // exposition-only
    constexpr auto& /*get-inner*/();                  // exposition-only
    constexpr void /*erfüllen*/();                     // exposition-only
  public:
    using iterator_concept  = /* siehe Beschreibung */;
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using value_type        = /* siehe Beschreibung */;
    using difference_type   = /* siehe Beschreibung */;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, /*OuterIter*/> &&
               convertible_to<iterator_t</*InnerRng*/>, /*InnerIter*/> &&
               convertible_to<iterator_t<Pattern>, /*PatternIter*/>;
    constexpr decltype(auto) operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*ref-is-glvalue*/
               && forward_iterator</*OuterIter*/> && forward_iterator</*InnerIter*/>;
    constexpr /*iterator*/& operator--()
      requires /*ref-is-glvalue*/ && bidirectional_range</*Basis*/> &&
               /*bidirektional-allgemein*/</*InnerBase*/> &&
               /*bidirektional-allgemein*/</*PatternBase*/>;
    constexpr /*iterator*/ operator--(int)
      requires /*ref-is-glvalue*/ && bidirectional_range</*Basis*/> &&
               /*bidirektional-allgemein*/</*InnerBase*/> &&
               /*bidirektional-allgemein*/</*PatternBase*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires /*ref-is-glvalue*/
               && forward_range</*Basis*/> && equality_comparable</*InnerIter*/>;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& x)
    {
      using rvalue_reference =
        common_reference_t<iter_rvalue_reference_t</*InnerIter*/>,
                           iter_rvalue_reference_t</*PatternIter*/>>;
      return visit<rvalue_reference>(ranges::iter_move, x./*inner-it_*/);
    }
    friend constexpr void iter_swap(const /*iterator*/& x, const /*iterator*/& y)
      requires indirectly_swappable</*InnerIter*/, /*PatternIter*/>
    {
      visit(ranges::iter_swap, x./*inner-it_*/, y./*inner-it_*/);
    }
  };
}

Klassentemplate std::ranges::join_with_view::sentinel

namespace std::ranges {
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>> && view<Pattern> &&
             /*concatable*/<range_reference_t<V>, Pattern>
  template<bool Const>
  class join_with_view<V, Pattern>::/*sentinel*/
  {
    using /*Parent*/ = /*maybe-const*/<Const, join_with_view>; // nur zur Darstellung
    using /*Base*/   = /*maybe-const*/<Const, V>;              // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // nur zur Darstellung
    constexpr explicit /*sentinel*/(/*Parent*/& parent); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> s)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
  };
}

Klassentemplate std::ranges::lazy_split_view

namespace std::ranges {
  template<auto>
  struct /*require-constant*/; // exposition-only
  template<class R>
  concept /*tiny-range*/ = // exposition-only
    sized_range<R> && requires {
      typename /*require-constant*/<remove_reference_t<R>::size()>;
    } && (remove_reference_t<R>::size() <= 1);
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>>
  {
  private:
    V /*base_*/          = V();       // exposition-only
    Pattern /*Muster_*/ = Pattern(); // exposition-only
    /*nicht-verbreitender-Cache*/<iterator_t<V>> /*current_*/; // exposition-only present only
                                                           // wenn forward_range<V> false ist
    // class template lazy_split_view::outer-iterator
    template<bool>
    struct /*outer-iterator*/; // exposition-only
    // class template lazy_split_view::inner-iterator
    template<bool>
    struct /*inner-iterator*/; // exposition-only
  public:
    lazy_split_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit lazy_split_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t<R>> &&
               constructible_from<Pattern, single_view<range_value_t<R>>>
    constexpr explicit lazy_split_view(R&& r, range_value_t<R> e);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        return /*outer-iterator*/ < /*simple-view*/<V> &&
               /*simple-view*/ < Pattern >> { *this, ranges::begin(/*base_*/) };
      } else {
        /*current_*/ = ranges::begin(/*base_*/);
        return /*outer-iterator*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<V> && forward_range<const V>
    {
      return /*outer-iterator*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
      requires forward_range<V> && common_range<V>
    {
      return /*outer-iterator*/ < /*simple-view*/<V> &&
             /*simple-view*/ < Pattern >> { *this, ranges::end(/*base_*/) };
    }
    constexpr auto end() const
    {
      if constexpr (forward_range<V> && forward_range<const V> && common_range<const V>)
        return /*outer-iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return default_sentinel;
    }
  };
  template<class R, class P>
  lazy_split_view(R&&, P&&) -> lazy_split_view<views::all_t<R>, views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung wurde originalgetreu erhalten
- Der Text innerhalb der Tags wurde nicht verändert, da es sich um Code handelt<P>>;
  template<input_range R>
  lazy_split_view(R&&, range_value_t<R>)
    -> lazy_split_view<views::all_t<R>, single_view<range_value_t<R>>>;
}

Klassentemplate std::ranges::lazy_split_view::outer_iterator

namespace std::ranges {
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  template<bool Const>
  struct lazy_split_view<V, Pattern>::/*outer-iterator*/
  {
  private:
    using /*Parent*/        = /*maybe-const*/<Const, lazy_split_view>; // nur zur Darstellung
    using /*Base*/          = /*maybe-const*/<Const, V>;               // nur zur Darstellung
    /*Parent*/* /*parent_*/ = nullptr;                                 // nur zur Darstellung
    iterator_t</*Base*/> /*current_*/ =
      iterator_t</*Base*/>(); // nur zur Darstellung, nur vorhanden
                              // wenn V forward_range modelliert
    bool /*trailing-empty_*/ = false; // nur zur Darstellung
  public:
    using iterator_concept =
      conditional_t<forward_range</*Base*/>, forward_iterator_tag, input_iterator_tag>;
    using iterator_category = input_iterator_tag; // nur vorhanden wenn Base
                                                  // forward_range modelliert
    // Klasse lazy_split_view::outer-iterator::value_type
    struct value_type;
    using difference_type = range_difference_t</*Base*/>;
    /*outer-iterator*/()  = default;
    constexpr explicit /*outer-iterator*/(/*Parent*/& parent)
      requires(!forward_range</*Base*/>);
    constexpr /*outer-iterator*/(/*Parent*/& parent, iterator_t</*Base*/> current)
      requires forward_range</*Base*/>;
    constexpr /*outer-iterator*/(/*outer-iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr value_type operator*() const;
    constexpr /*outer-iterator*/& operator++();
    constexpr decltype(auto) operator++(int)
    {
      if constexpr (forward_range</*Base*/>) {
        auto tmp = *this;
        ++*this;
        return tmp;
      } else
        ++*this;
    }
    friend constexpr bool operator==(const /*outer-iterator*/& x,
                                     const /*outer-iterator*/& y)
      requires forward_range</*Base*/>;
    friend constexpr bool operator==(const /*outer-iterator*/& x, default_sentinel_t);
  };
}

Klassentemplate std::ranges::lazy_split_view::outer_iterator::value_type

namespace std::ranges {
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  template<bool Const>
  struct lazy_split_view<V, Pattern>::/*outer-iterator*/<Const>::value_type
    : view_interface<value_type>
  {
  private:
    /*outer-iterator*/ /*i_*/ = /*outer-iterator*/(); // nur zur Darstellung
    constexpr explicit value_type(/*outer-iterator*/ i); // nur zur Darstellung
  public:
    constexpr /*inner-iterator*/<Const> begin() const;
    constexpr default_sentinel_t end() const noexcept;
  };
}

Klassentemplate std::ranges::lazy_split_view::inner_iterator

namespace std::ranges {
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  template<bool Const>
  struct lazy_split_view<V, Pattern>::/*inner-iterator*/
  {
  private:
    using /*Base*/                   = /*maybe-const*/<Const, V>;   // nur zur Darstellung
    /*outer-iterator*/<Const> /*i_*/ = /*outer-iterator*/<Const>(); // nur zur Darstellung
    bool /*incremented_*/            = false;                       // nur zur Darstellung
  public:
    using iterator_concept  = typename /*outer-iterator*/<Const>::iterator_concept;
    using iterator_category = /* siehe Beschreibung */; // nur vorhanden, wenn Base
                                                     // forward_range modelliert
    using value_type      = range_value_t</*Base*/>;
    using difference_type = range_difference_t</*Base*/>;
    /*inner-iterator*/()  = default;
    constexpr explicit /*inner-iterator*/(/*outer-iterator*/<Const> i);
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr iterator_t</*Base*/> base() &&
        requires forward_range<V>;
    constexpr decltype(auto) operator*() const { return */*i_*/./*current*/; }
    constexpr /*inner-iterator*/& operator++();
    constexpr decltype(auto) operator++(int)
    {
      if constexpr (forward_range</*Base*/>) {
        auto tmp = *this;
        ++*this;
        return tmp;
      } else
        ++*this;
    }
    friend constexpr bool operator==(const /*inner-iterator*/& x,
                                     const /*inner-iterator*/& y)
      requires forward_range</*Base*/>;
    friend constexpr bool operator==(const /*inner-iterator*/& x, default_sentinel_t);
    friend constexpr decltype(auto) iter_move(const /*inner-iterator*/& i) noexcept(
      noexcept(ranges::iter_move(i./*i_*/./*current*/)))
    {
      return ranges::iter_move(i./*i_*/./*current*/);
    }
    friend constexpr void
    iter_swap(const /*inner-iterator*/& x, const /*inner-iterator*/& y) noexcept(
      noexcept(ranges::iter_swap(x./*i_*/./*current*/, y./*i_*/./*current*/)))
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

Klassentemplate std::ranges::split_view

namespace std::ranges {
  template<forward_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
  class split_view : public view_interface<split_view<V, Pattern>>
  {
  private:
    V /*base_*/          = V();       // nur zur Darstellung
    Pattern /*pattern_*/ = Pattern(); // nur zur Darstellung
    // Klasse split_view::iterator
    struct /*iterator*/; // nur zur Darstellung
    // Klasse split_view::sentinel
    struct /*sentinel*/; // nur zur Darstellung
  public:
    split_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit split_view(V base, Pattern pattern);
    template<forward_range R>
      requires constructible_from<V, views::all_t<R>> &&
               constructible_from<Pattern, single_view<range_value_t<R>>>
    constexpr explicit split_view(R&& r, range_value_t<R> e);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr /*iterator*/ begin();
    constexpr auto end()
    {
      if constexpr (common_range<V>) {
        return /*iterator*/{ *this, ranges::end(/*base_*/), {} };
      } else {
        return /*sentinel*/{ *this };
      }
    }
    constexpr subrange<iterator_t<V>> /*find-next*/(iterator_t<V>); // nur zur Darstellung
  };
  template<class R, class P>
  split_view(R&&, P&&) -> split_view<views::all_t<R>, views::all_t<P>>;
  template<forward_range R>
  split_view(R&&, range_value_t<R>)
    -> split_view<views::all_t<R>, single_view<range_value_t<R>>>;
}

Klassentemplate std::ranges::split_view::iterator

namespace std::ranges {
  template<forward_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
  class split_view<V, Pattern>::/*iterator*/
  {
  private:
    split_view* /*parent_*/           = nullptr;                   // nur zur Darstellung
    iterator_t<V> /*cur_*/            = iterator_t<V>();           // nur zur Darstellung
    subrange<iterator_t<V>> /*next_*/ = subrange<iterator_t<V>>(); // nur zur Darstellung
    bool /*trailing-empty_*/          = false;                     // nur zur Darstellung
  public:
    using iterator_concept  = forward_iterator_tag;
    using iterator_category = input_iterator_tag;
    using value_type        = subrange<iterator_t<V>>;
    using difference_type   = range_difference_t<V>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(split_view& parent,
                           iterator_t<V> current,
                           subrange<iterator_t<V>> next);
    constexpr iterator_t<V> base() const;
    constexpr value_type operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
  };
}

Klassentemplate std::ranges::split_view::sentinel

namespace std::ranges {
  template<forward_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
  struct split_view<V, Pattern>::/*Sentinel*/
  {
  private:
    sentinel_t<V> /*end_*/ = sentinel_t<V>(); // nur zur Darstellung
  public:
    /*Sentinel*/() = default;
    constexpr explicit /*Sentinel*/(split_view& parent);
    friend constexpr bool operator==(const /*Iterator*/& x, const /*Sentinel*/& y);
  };
}

Klassentemplate std::ranges::concat

namespace std::ranges {
  template<class... Rs>
  using /*concat-reference-t*/ =
    common_reference_t<range_reference_t<Rs>...>; // Nur zur Darstellung
  template<class... Rs>
  using /*concat-value-t*/ = common_type_t<range_value_t<Rs>...>; // Nur zur Darstellung
  template<class... Rs>
  using /*concat-rvalue-reference-t*/ = // Nur zur Darstellung
    common_reference_t<range_rvalue_reference_t<Rs>...>;
  template<class... Rs>
  concept /*concat-indirectly-readable*/ = /* siehe Beschreibung */; // Nur zur Darstellung
  template<class... Rs>
  concept /*concatable*/ = /* siehe Beschreibung */; // Nur zur Darstellung
  template<bool Const, class... Rs>
  concept /*concat-is-random-access*/ = /* siehe Beschreibung */; // Nur zur Darstellung
  template<bool Const, class... Rs>
  concept /*concat-is-bidirectional*/ = /* siehe Beschreibung */; // Nur zur Darstellung
  template<input_range... Views>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...>
  class concat_view : public view_interface<concat_view<Views...>>
  {
    tuple<Views...> /*views_*/; // Nur zur Darstellung
    // Klassentemplate concat_view::iterator
    template<bool>
    class /*iterator*/; // Nur zur Darstellung
  public:
    constexpr concat_view() = default;
    constexpr explicit concat_view(Views... views);
    constexpr /*iterator*/<false> begin()
      requires(!(/*simple-view*/<Views> && ...));
    constexpr /*iterator*/<true> begin() const
      requires(range<const Views> && ...) && /*concatable*/<const Views...>;
    constexpr auto end()
      requires(!(/*simple-view*/<Views> && ...));
    constexpr auto end() const
      requires(range<const Views> && ...) && /*concatable*/<const Views...>;
    constexpr auto size()
      requires(sized_range<Views> && ...);
    constexpr auto size() const
      requires(sized_range<const Views> && ...);
  };
  template<class... R>
  concat_view(R&&...) -> concat_view<views::all_t<R>...>;
}

Klassentemplate std::ranges::concat::iterator

namespace std::ranges {
  template<input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*verknüpfbar*/<Views...>
  template<bool Const>
  class concat_view<Views...>::/*iterator*/
  {
  public:
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using iterator_concept  = /* siehe Beschreibung */;
    using value_type        = /*concat-value-t*/</*vielleicht-konstant*/<Const, Views>...>;
    using difference_type =
      common_type_t<range_difference_t</*vielleicht-konst*/<Const, Views>>...>;
  private:
    using /*Basis-Iterator*/ = // exposition-only
      variant<iterator_t</*vielleicht-konst*/<Const, Views>>...>;
    /*vielleicht-konst*/<Const, concat_view>* /*parent_*/ = nullptr; // exposition-only
    /*Basis-Iterator*/ /*it_*/;                                      // exposition-only
    template<size_t N>
    constexpr void /*erfüllen*/(); // exposition-only
    template<size_t N>
    constexpr void /*vorher*/(); // exposition-only
    template<size_t N>
    constexpr void /*advance-fwd*/(difference_type offset, // exposition-only
                                   difference_type steps);
    template<size_t N>
    constexpr void /*advance-bwd*/(difference_type offset, // exposition-only
                                   difference_type steps);
    template<class... Args>
    constexpr explicit /*iterator*/(
      /*vielleicht-konst*/<Const, concat_view>* parent, // exposition-only
      Args&&... args)
      requires constructible_from</*Basis-Iterator*/, Args&&...>;
  public:
    /*iterator*/() = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr decltype(auto) operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*all-forward*/<Const, Views...>;
    constexpr /*iterator*/& operator--()
      requires /*concat-is-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/ operator--(int)
      requires /*concat-is-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires(equality_comparable<iterator_t</*vielleicht-konst*/<Const, Views>>> && ...);
    friend constexpr bool operator==(const /*iterator*/& it, default_sentinel_t);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires(/*all-random-access*/<Const, Views...> &&
               (three_way_comparable<iterator_t</*vielleicht-konst*/<Const, Views>>> && ...));
    friend constexpr /*iterator*/ operator+(const /*iterator*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& it)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x, default_sentinel_t)
      requires /* siehe Beschreibung */;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterator*/& x)
      requires /* siehe Beschreibung */;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& it) noexcept(
      /* siehe Beschreibung */);
    friend constexpr void iter_swap(const /*iterator*/& x,
                                    const /*iterator*/& y) noexcept(/* siehe Beschreibung */)
      requires /* siehe Beschreibung */;
  };
}

Klassentemplate std::ranges::common_view

namespace std::ranges {
  template<view V>
    requires(!common_range<V> && copyable<iterator_t<V>>)
  class common_view : public view_interface<common_view<V>>
  {
  private:
    V /*base_*/ = V(); // exposition-only
  public:
    common_view()
      requires default_initializable<V>
    = default;
    constexpr explicit common_view(V r);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (random_access_range<V> && sized_range<V>)
        return ranges::begin(/*base_*/);
      else
        return common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      if constexpr (random_access_range<const V> && sized_range<const V>)
        return ranges::begin(/*base_*/);
      else
        return common_iterator<iterator_t<const V>, sentinel_t<const V>>(
          ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (random_access_range<V> && sized_range<V>)
        return ranges::begin(/*base_*/) + ranges::distance(/*base_*/);
      else
        return common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::end(/*base_*/));
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (random_access_range<const V> && sized_range<const V>)
        return ranges::begin(/*base_*/) + ranges::distance(/*base_*/);
      else
        return common_iterator<iterator_t<const V>, sentinel_t<const V>>(
          ranges::end(/*base_*/));
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  };
  template<class R>
  common_view(R&&) -> common_view<views::all_t<R>>;
}

Klassentemplate std::ranges::reverse_view

namespace std::ranges {
  template<view V>
    requires bidirectional_range<V>
  class reverse_view : public view_interface<reverse_view<V>>
  {
  private:
    V /*base_*/ = V(); // nur zur Darstellung
  public:
    reverse_view()
      requires default_initializable<V>
    = default;
    constexpr explicit reverse_view(V r);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr reverse_iterator<iterator_t<V>> begin();
    constexpr reverse_iterator<iterator_t<V>> begin()
      requires common_range<V>;
    constexpr auto begin() const
      requires common_range<const V>;
    constexpr reverse_iterator<iterator_t<V>> end();
    constexpr auto end() const
      requires common_range<const V>;
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  };
  template<class R>
  reverse_view(R&&) -> reverse_view<views::all_t<R>>;
}

Klassentemplate std::ranges::as_const_view

namespace std::ranges {
  template<view V>
    requires input_range<V>
  class as_const_view : public view_interface<as_const_view<V>>
  {
    V /*base_*/ = V(); // nur zur Darstellung
  public:
    as_const_view()
      requires default_initializable<V>
    = default;
    constexpr explicit as_const_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return ranges::cbegin(/*base_*/);
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return ranges::cbegin(/*base_*/);
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      return ranges::cend(/*base_*/);
    }
    constexpr auto end() const
      requires range<const V>
    {
      return ranges::cend(/*base_*/);
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  };
  template<class R>
  as_const_view(R&&) -> as_const_view<views::all_t<R>>;
}

Klassentemplate std::ranges::elements_view

namespace std::ranges {
  template<class T, size_t N>
  concept /*has-tuple-element*/ = // exposition-only
    /*tuple-like*/<T> && N < tuple_size_v<T>;
  template<class T, size_t N>
  concept /*rückgabefähiges Element*/ = // exposition-only
    is_reference_v<T> || move_constructible<tuple_element_t<N, T>>;
  template<input_range V, size_t N>
    requires view<V> && /*has-tuple-element*/<range_value_t<V>, N> &&
             /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> &&
             /*rückgabefähiges Element*/<range_reference_t<V>, N>
  class elements_view : public view_interface<elements_view<V, N>>
  {
  public:
    elements_view()
      requires default_initializable<V>
    = default;
    constexpr explicit elements_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return /*iterator*/<false>(ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*iterator*/<true>(ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*simple-view*/<V> && !common_range<V>)
    {
      return /*sentinel*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end()
      requires(!/*simple-view*/<V> && common_range<V>)
    {
      return /*iterator*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires range<const V>
    {
      return /*sentinel*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires common_range<const V>
    {
      return /*iterator*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  private:
    // Klassentemplate elements_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // Klassentemplate elements_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
    V /*base_*/ = V(); // exposition-only
  };
}

Klassentemplate std::ranges::elements_view::iterator

namespace std::ranges {
  template<input_range V, size_t N>
    requires view<V> && /*has-tuple-element*/<range_value_t<V>, N> &&
             /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> &&
             /*rückgabefähiges Element*/<range_reference_t<V>, N>
  template<bool Const>
  class elements_view<V, N>::/*iterator*/
  {
    using /*Basis*/                    = /*vielleicht-konst*/<Const, V>; // exposition-only
    iterator_t</*Basis*/> /*current_*/ = iterator_t</*Basis*/>(); // exposition-only
    static constexpr decltype(auto) /*get-element*/(
      const iterator_t</*Basis*/>& i); // exposition-only
  public:
    using iterator_concept  = /* siehe Beschreibung */;
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using value_type        = remove_cvref_t<tuple_element_t<N, range_value_t</*Basis*/>>>;
    using difference_type   = range_difference_t</*Basis*/>;
    /*iterator*/()
      requires default_initializable<iterator_t</*Basis*/>>
    = default;
    constexpr explicit /*iterator*/(iterator_t</*Basis*/> current);
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>>;
    constexpr const iterator_t</*Basis*/>& base() const& noexcept;
    constexpr iterator_t</*Basis*/> base() &&;
    constexpr decltype(auto) operator*() const { return /*get-element*/(/*current_*/); }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Basis*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Basis*/>
    {
      return /*get-element*/(/*current_*/ + n);
    }
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*Basis*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> && three_way_comparable<iterator_t</*Basis*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Basis*/>, iterator_t</*Basis*/>>;
  };
}

Klassentemplate std::ranges::elements_view::sentinel

namespace std::ranges {
  template<input_range V, size_t N>
    requires view<V> && /*has-tuple-element*/<range_value_t<V>, N> &&
             /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> &&
             /*returnable-element*/<range_reference_t<V>, N>
  template<bool Const>
  class elements_view<V, N>::/*sentinel*/
  {
  private:
    using /*Base*/                = /*maybe-const*/<Const, V>; // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end);
    constexpr /*sentinel*/(/*sentinel*/<!Const> other)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr sentinel_t</*Base*/> base() const;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*iterator*/<OtherConst>& x,
      const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*sentinel*/& x,
      const /*iterator*/<OtherConst>& y);
  };
}

Klassentemplate std::ranges::enumerate_view

namespace std::ranges {
  template<view V>
    requires /*range-with-movable-references*/<V>
  class enumerate_view : public view_interface<enumerate_view<V>>
  {
    V /*base_*/ = V(); // exposition-only
    // Klassentemplate enumerate_view::iterator
    template<bool Const>
    class /*iterator*/; // exposition-only
    // Klassentemplate enumerate_view::sentinel
    template<bool Const>
    class /*sentinel*/; // exposition-only
  public:
    constexpr enumerate_view()
      requires default_initializable<V>
    = default;
    constexpr explicit enumerate_view(V base);
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return /*iterator*/<false>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto begin() const
      requires /*range-with-movable-references*/<const V>
    {
      return /*iterator*/<true>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (forward_range<V> && common_range<V> && sized_range<V>)
        return /*iterator*/<false>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*sentinel*/<false>(ranges::end(/*base_*/));
    }
    constexpr auto end() const
      requires /*range-with-movable-references*/<const V>
    {
      if constexpr (forward_range<const V> && common_range<const V> &&
                    sized_range<const V>)
        return /*iterator*/<true>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*sentinel*/<true>(ranges::end(/*base_*/));
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
  };
  template<class R>
  enumerate_view(R&&) -> enumerate_view<views::all_t<R>>;
}

Klassentemplate std::ranges::enumerate_view::iterator

namespace std::ranges {
  template<view V>
    requires /*range-with-movable-references*/<V>
  template<bool Const>
  class enumerate_view<V>::/*iterator*/
  {
    using /*Basis*/ = /*vielleicht-konstant*/<Const, V>; // exposition-only
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* siehe Beschreibung */;
    using difference_type   = range_difference_t</*Basis*/>;
    using value_type        = tuple<difference_type, range_value_t</*Basis*/>>;
  private:
    using /*Referenztyp*/ = // exposition-only
      tuple<difference_type, range_reference_t</*Basis*/>>;
    iterator_t</*Basis*/> /*current_*/ = iterator_t</*Basis*/>(); // exposition-only
    difference_type /*pos_*/          = 0;                      // exposition-only
    constexpr explicit /*iterator*/(iterator_t</*Basis*/> current,
                                    difference_type pos); // exposition-only
  public:
    /*iterator*/()
      requires default_initializable<iterator_t</*Basis*/>>
    = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>>;
    constexpr const iterator_t</*Basis*/>& base() const& noexcept;
    constexpr iterator_t</*Basis*/> base() &&;
    constexpr difference_type index() const noexcept;
    constexpr auto operator*() const
    {
      return /*Referenztyp*/(/*pos_*/, */*current_*/);
    }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Basis*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Basis*/>
    {
      return /*Referenztyp*/(/*pos_*/ + n, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*iterator*/& x,
                                     const /*iterator*/& y) noexcept;
    friend constexpr strong_ordering operator<=>(const /*iterator*/& x,
                                                 const /*iterator*/& y) noexcept;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y) noexcept;
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      noexcept(ranges::iter_move(i./*current_*/)) &&
      is_nothrow_move_constructible_v<range_rvalue_reference_t</*Basis*/>>)
    {
      return tuple<difference_type, range_rvalue_reference_t</*Basis*/>>(
        i./*pos_*/, ranges::iter_move(i./*current_*/));
    }
  };
}

Klassentemplate std::ranges::enumerate_view::sentinel

namespace std::ranges {
  template<view V>
    requires /*range-with-movable-references*/<V>
  template<bool Const>
  class enumerate_view<V>::/*sentinel*/
  {
    using /*Base*/                = /*maybe-const*/<Const, V>; // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // nur zur Darstellung
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> other)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr sentinel_t</*Base*/> base() const;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*iterator*/<OtherConst>& x,
      const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V> operator-(
      const /*sentinel*/& x,
      const /*iterator*/<OtherConst>& y);
  };
}

Klassentemplate std::ranges::zip_view

namespace std::ranges {
  template<class... Rs>
  concept /*zip-ist-üblich*/ = // exposition-only
    (sizeof...(Rs) == 1 && (common_range<Rs> && ...)) ||
    (!(bidirectional_range<Rs> && ...) && (common_range<Rs> && ...)) ||
    ((random_access_range<Rs> && ...) && (sized_range<Rs> && ...));
  template<input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view : public view_interface<zip_view<Views...>>
  {
    tuple<Views...> /*views_*/; // exposition-only
    // Klassentemplate zip_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // Klassentemplate zip_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    zip_view() = default;
    constexpr explicit zip_view(Views... views);
    constexpr auto begin()
      requires(!(/*simple-view*/<Views> && ...))
    {
      return /*iterator*/<false>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto begin() const
      requires(range<const Views> && ...)
    {
      return /*iterator*/<true>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto end()
      requires(!(/*simple-view*/<Views> && ...))
    {
      if constexpr (!/*zip-ist-üblich*/<Views...>) {
        return /*sentinel*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<Views> && ...)) {
        return begin() + iter_difference_t</*iterator*/<false>>(size());
      } else {
        return /*iterator*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto end() const
      requires(range<const Views> && ...)
    {
      if constexpr (!/*zip-ist-üblich*/<const Views...>) {
        return /*sentinel*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<const Views> && ...)) {
        return begin() + iter_difference_t</*iterator*/<true>>(size());
      } else {
        return /*iterator*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto size()
      requires(sized_range<Views> && ...);
    constexpr auto size() const
      requires(sized_range<const Views> && ...);
  };
  template<class... Rs>
  zip_view(Rs&&...) -> zip_view<views::all_t
(Anmerkung: Der Text enthält nur C++-spezifische Begriffe und HTML-Tags, die gemäß den Anforderungen nicht übersetzt werden müssen. Der Link und die Formatierung bleiben unverändert.)<Rs>...>;
}

Klassentemplate std::ranges::zip_view::iterator

namespace std::ranges {
  template<input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  template<bool Const>
  class zip_view<Views...>::/*iterator*/
  {
    tuple<iterator_t</*vielleicht-konst*/<Const, Views>>...> /*current_*/; // exposition-only
    constexpr explicit /*iterator*/(tuple<iterator_t</*vielleicht-konst*/<Const, Views>>...>);
    // exposition-only
  public:
    using iterator_category = input_iterator_tag; // nicht immer vorhanden
    using iterator_concept  = /* siehe Beschreibung */;
    using value_type        = tuple<range_value_t</*vielleicht-konst*/<Const, Views>>...>;
    using difference_type =
      common_type_t<range_difference_t</*vielleicht-konst*/<Const, Views>>...>;
    /*iterator*/() = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*all-forward*/<Const, Views...>;
    constexpr /*iterator*/& operator--()
      requires /*all-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/ operator--(int)
      requires /*all-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires /*all-random-access*/<Const, Views...>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires /*all-random-access*/<Const, Views...>;
    constexpr auto operator[](difference_type n) const
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires(equality_comparable<iterator_t</*vielleicht-konst*/<Const, Views>>> && ...);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires(sized_sentinel_for<iterator_t</*vielleicht-konst*/<Const, Views>>,
                                  iterator_t</*vielleicht-konst*/<Const, Views>>> &&
               ...);
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      /* siehe Beschreibung */);
    friend constexpr void iter_swap(const /*iterator*/& l,
                                    const /*iterator*/& r) noexcept(/* siehe Beschreibung */)
      requires(indirectly_swappable<iterator_t</*vielleicht-konst*/<Const, Views>>> && ...);
  };
}

Klassentemplate std::ranges::zip_view::sentinel

namespace std::ranges {
  template<input_range... Views>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  template<bool Const>
  class zip_view<Views...>::/*sentinel*/
  {
    tuple<sentinel_t</*maybe-const*/<Const, Views>>...> /*end_*/; // nur zur Darstellung
    constexpr explicit /*sentinel*/(
      tuple<sentinel_t</*maybe-const*/<Const, Views>>...> end);
    // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> i)
      requires Const &&
               (convertible_to<sentinel_t<Views>, sentinel_t<const Views>> && ...);
    template<bool OtherConst>
      requires(sentinel_for<sentinel_t</*maybe-const*/<Const, Views>>,
                            iterator_t</*maybe-const*/<OtherConst, Views>>> &&
               ...)
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires(sized_sentinel_for<sentinel_t</*maybe-const*/<Const, Views>>,
                                  iterator_t</*maybe-const*/<OtherConst, Views>>> &&
               ...)
    friend constexpr common_type_t<
      range_difference_t</*maybe-const*/<OtherConst, Views>>...>
    operator-(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y);
    template<bool OtherConst>
      requires(sized_sentinel_for<sentinel_t</*maybe-const*/<Const, Views>>,
                                  iterator_t</*maybe-const*/<OtherConst, Views>>> &&
               ...)
    friend constexpr common_type_t<
      range_difference_t</*maybe-const*/<OtherConst, Views>>...>
    operator-(const /*sentinel*/& y, const /*iterator*/<OtherConst>& x);
  };
}

Klassentemplate std::ranges::zip_transform_view

namespace std::ranges {
  template<move_constructible F, input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*kann-referenziert-werden*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view : public view_interface<zip_transform_view<F, Views...>>
  {
    /*bewegliche Box*/<F> /*fun_*/; // exposition-only
    zip_view<Views...> /*zip_*/; // exposition-only
    using /*InnerView*/ = zip_view<Views...>; // exposition-only
    template<bool Const>
    using /*ziperator*/ =
      iterator_t</*vielleicht-konst*/<Const, /*InnerView*/>>; // exposition-only
    template<bool Const>
    using /*zentinel*/ =
      sentinel_t</*vielleicht-konst*/<Const, /*InnerView*/>>; // exposition-only
    // Klassentemplate zip_transform_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // class template zip_transform_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    zip_transform_view() = default;
    constexpr explicit zip_transform_view(F fun, Views... views);
    constexpr auto begin() { return /*iterator*/<false>(*this, /*zip_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      return /*iterator*/<true>(*this, /*zip_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*InnerView*/>) {
        return /*iterator*/<false>(*this, /*zip_*/.end());
      } else {
        return /*sentinel*/<false>(/*zip_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      if constexpr (common_range<const /*InnerView*/>) {
        return /*iterator*/<true>(*this, /*zip_*/.end());
      } else {
        return /*sentinel*/<true>(/*zip_*/.end());
      }
    }
    constexpr auto size()
      requires sized_range</*InnerView*/>
    {
      return /*zip_*/.size();
    }
    constexpr auto size() const
      requires sized_range<const /*InnerView*/>
    {
      return /*zip_*/.size();
    }
  };
  template<class F, class... Rs>
  zip_transform_view(F, Rs&&...) -> zip_transform_view<F, views::all_t
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten (``, ``)
- Der C++-spezifische Begriff `views::all_t` wurde nicht übersetzt
- Die Formatierung und Struktur entsprechen exakt dem Original
- Der Text wurde professionell gemäß den Vorgaben behandelt<Rs>...>;
}

Klassentemplate std::ranges::zip_transform_view::iterator

namespace std::ranges {
  template<move_constructible F, input_range... Ansichten>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*kann-referenziert-werden*/<invoke_result_t<F&, range_reference_t<Views>...>>
  template<bool Const>
  class zip_transform_view<F, Views...>::/*iterator*/
  {
    using /*Eltern*/ = /*vielleicht-konst*/<Const, zip_transform_view>; // exposition-only
    using /*Basis*/   = /*vielleicht-konst*/<Const, /*InnerView*/>;      // exposition-only
    /*Eltern*/* /*parent_*/ = nullptr;                             // exposition-only
    /*ziperator*/<Const> /*inner_*/;                               // exposition-only
    constexpr /*iterator*/(/*Eltern*/& parent,
                           /*ziperator*/<Const> inner); // exposition-only
  public:
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    using iterator_concept  = typename /*ziperator*/<Const>::iterator_concept;
    using value_type        = remove_cvref_t<
      invoke_result_t</*vielleicht-konst*/<Const, F>&,
                      range_reference_t</*vielleicht-konst*/<Const, Views>>...>>;
    using difference_type = range_difference_t</*Basis*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to</*ziperator*/<false>, /*ziperator*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* siehe Beschreibung */);
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Basis*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable</*ziperator*/<Const>>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for</*ziperator*/<Const>, /*ziperator*/<Const>>;
  };
}

Klassentemplate std::ranges::zip_transform_view::sentinel

namespace std::ranges {
  template<move_constructible F, input_range... Views>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*can-reference*/<invoke_result_t<F&, range_reference_t<Views>...>>
  template<bool Const>
  class zip_transform_view<F, Views...>::/*sentinel*/
  {
    /*zentinel*/<Const> /*inner_*/;                             // nur zur Darstellung
    constexpr explicit /*sentinel*/(/*zentinel*/<Const> inner); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> i)
      requires Const && convertible_to</*zentinel*/<false>, /*zentinel*/<Const>>;
    template<bool OtherConst>
      requires sentinel_for</*zentinel*/<Const>, /*ziperator*/<OtherConst>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for</*zentinel*/<Const>, /*ziperator*/<OtherConst>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>>
    operator-(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for</*zentinel*/<Const>, /*ziperator*/<OtherConst>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>>
    operator-(const /*sentinel*/& x, const /*iterator*/<OtherConst>& y);
  };
}

Klassentemplate std::ranges::adjacent_view

namespace std::ranges {
  template<forward_range V, size_t N>
    requires view<V> && (N > 0)
  class adjacent_view : public view_interface<adjacent_view<V, N>>
  {
    V /*base_*/ = V(); // nur zur Darstellung
    // Klassentemplate adjacent_view::iterator
    template<bool>
    class /*iterator*/; // nur zur Darstellung
    // Klassentemplate adjacent_view::sentinel
    template<bool>
    class /*sentinel*/; // nur zur Darstellung
    struct /*as-sentinel*/
    {}; // nur zur Darstellung
  public:
    adjacent_view()
      requires default_initializable<V>
    = default;
    constexpr explicit adjacent_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return /*iterator*/<false>(ranges::begin(/*base_*/), ranges::end(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*iterator*/<true>(ranges::begin(/*base_*/), ranges::end(/*base_*/));
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (common_range<V>) {
        return /*iterator*/<false>(
          /*as-sentinel*/{}, ranges::begin(/*base_*/), ranges::end(/*base_*/));
      } else {
        return /*sentinel*/<false>(ranges::end(/*base_*/));
      }
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (common_range<const V>) {
        return /*iterator*/<true>(
          /*as-sentinel*/{}, ranges::begin(/*base_*/), ranges::end(/*base_*/));
      } else {
        return /*sentinel*/<true>(ranges::end(/*base_*/));
      }
    }
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>;
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>;
  };
}

Klassentemplate std::ranges::adjacent_view::iterator

namespace std::ranges {
  template<forward_range V, size_t N>
    requires view<V> && (N > 0)
  template<bool Const>
  class adjacent_view<V, N>::/*iterator*/
  {
    using /*Basis*/ = /*vielleicht-konst*/<Const, V>; // exposition-only
    array<iterator_t</*Basis*/>, N> /*current_*/ =
      array<iterator_t</*Basis*/>, N>(); // exposition-only
    constexpr /*iterator*/(iterator_t</*Basis*/> first,
                           sentinel_t</*Basis*/> last); // exposition-only
    constexpr /*iterator*/(/*as-sentinel*/,
                           iterator_t</*Basis*/> first,
                           iterator_t</*Basis*/> last);
    // exposition-only
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* siehe Beschreibung */;
    using value_type        = tuple</*WIEDERHOLEN*/(range_value_t</*Basis*/>, N)...>;
    using difference_type   = range_difference_t</*Basis*/>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>>;
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> && three_way_comparable<iterator_t</*Basis*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Basis*/>, iterator_t</*Basis*/>>;
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      /* siehe Beschreibung */);
    friend constexpr void iter_swap(const /*iterator*/& l,
                                    const /*iterator*/& r) noexcept(/* siehe Beschreibung */)
      requires indirectly_swappable<iterator_t</*Basis*/>>;
  };
}

Klassentemplate std::ranges::adjacent_view::sentinel

namespace std::ranges {
  template<forward_range V, size_t N>
    requires view<V> && (N > 0)
  template<bool Const>
  class adjacent_view<V, N>::/*sentinel*/
  {
    using /*Base*/                = /*maybe-const*/<Const, V>; // nur zur Darstellung
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // nur zur Darstellung
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> i)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*iterator*/<OtherConst>& x,
      const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-(
      const /*sentinel*/& y,
      const /*iterator*/<OtherConst>& x);
  };
}

Klassentemplate std::ranges::adjacent_transform_view

namespace std::ranges {
  template<forward_range V, move_constructible F, size_t N>
    requires view<V> && (N > 0) && is_object_v<F> &&
             regular_invocable<F&, /*WIEDERHOLEN*/(range_reference_t<V>, N)...> &&
             /*kann-referenziert-werden*/<
               invoke_result_t<F&, /*WIEDERHOLEN*/(range_reference_t<V>, N)...>>
  class adjacent_transform_view : public view_interface<adjacent_transform_view<V, F, N>>
  {
    /*bewegliche Box*/<F> /*fun_*/;    // exposition-only
    adjacent_view<V, N> /*inner_*/; // exposition-only
    using /*InnerView*/ = adjacent_view<V, N>; // exposition-only
    template<bool Const>
    using /*inner-iterator*/ =
      iterator_t</*vielleicht-konst*/<Const, /*InnerView*/>>; // exposition-only
    template<bool Const>
    using /*inner-sentinel*/ =
      sentinel_t</*vielleicht-konst*/<Const, /*InnerView*/>>; // exposition-only
    // class template adjacent_transform_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // class template adjacent_transform_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    adjacent_transform_view() = default;
    constexpr explicit adjacent_transform_view(V base, F fun);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*inner_*/.base();
    }
    constexpr V base() && { return std::move(/*inner_*/).base(); }
    constexpr auto begin() { return /*iterator*/<false>(*this, /*inner_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, /*WIEDERHOLEN*/(range_reference_t<const V>, N)...>
    {
      return /*iterator*/<true>(*this, /*inner_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*InnerView*/>) {
        return /*iterator*/<false>(*this, /*inner_*/.end());
      } else {
        return /*sentinel*/<false>(/*inner_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, /*WIEDERHOLEN*/(range_reference_t<const V>, N)...>
    {
      if constexpr (common_range<const /*InnerView*/>) {
        return /*iterator*/<true>(*this, /*inner_*/.end());
      } else {
        return /*sentinel*/<true>(/*inner_*/.end());
      }
    }
    constexpr auto size()
      requires sized_range</*InnerView*/>
    {
      return /*inner_*/.size();
    }
    constexpr auto size() const
      requires sized_range<const /*InnerView*/>
    {
      return /*inner_*/.size();
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range</*InnerView*/>
    {
      return /*inner_*/.reserve_hint();
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const /*InnerView*/>
    {
      return /*inner_*/.reserve_hint();
    }
  };
}

Klassentemplate std::ranges::adjacent_transform_view::iterator

namespace std::ranges {
  template<forward_range V, move_constructible F, size_t N>
    requires view<V> && (N > 0) && is_object_v<F> &&
             regular_invocable<F&, /*WIEDERHOLEN*/(range_reference_t<V>, N)...> &&
             /*kann-referenziert-werden*/<
               invoke_result_t<F&, /*WIEDERHOLEN*/(range_reference_t<V>, N)...>>
  template<bool Const>
  class adjacent_transform_view<V, F, N>::/*iterator*/
  {
    using /*Eltern*/ = /*vielleicht-konst*/<Const, adjacent_transform_view>; // exposition-only
    using /*Basis*/   = /*vielleicht-konst*/<Const, V>;                       // exposition-only
    /*Eltern*/* /*parent_*/ = nullptr;                                  // exposition-only
    /*inner-iterator*/<Const> /*inner_*/;                               // exposition-only
    constexpr /*iterator*/(/*Elternklasse*/& parent,
                           /*inner-iterator*/<Const> inner); // exposition-only
  public:
    using iterator_category = /* siehe Beschreibung */;
    using iterator_concept  = typename /*inner-iterator*/<Const>::iterator_concept;
    using value_type =
      remove_cvref_t<invoke_result_t</*vielleicht-konstant*/<Const, F>&,
                                     /*REPEAT*/(range_reference_t</*Basis*/>, N)...>>;
    using difference_type = range_difference_t</*Basis*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const
               && convertible_to</*inner-iterator*/<false>, /*inner-iterator*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* siehe Beschreibung */);
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> &&
               three_way_comparable</*inner-iterator*/<Const>>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for</*inner-iterator*/<Const>, /*inner-iterator*/<Const>>;
  };
}

Klassentemplate std::ranges::adjacent_transform_view::sentinel

namespace std::ranges {
  template<forward_range V, move_constructible F, size_t N>
    requires view<V> && (N > 0) && is_object_v<F> &&
             regular_invocable<F&, /*REPEAT*/(range_reference_t<V>, N)...> &&
             /*can-reference*/<
               invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>>
  template<bool Const>
  class adjacent_transform_view<V, F, N>::/*sentinel*/
  {
    /*inner-sentinel*/<Const> /*inner_*/;                             // nur zur Darstellung
    constexpr explicit /*sentinel*/(/*inner-sentinel*/<Const> inner); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> i)
      requires Const
               && convertible_to</*inner-sentinel*/<false>, /*inner-sentinel*/<Const>>;
    template<bool OtherConst>
      requires sentinel_for</*inner-sentinel*/<Const>, /*inner-iterator*/<OtherConst>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for</*inner-sentinel*/<Const>,
                                  /*inner-iterator*/<OtherConst>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>>
    operator-(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for</*inner-sentinel*/<Const>,
                                  /*inner-iterator*/<OtherConst>>
    friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>>
    operator-(const /*sentinel*/& x, const /*iterator*/<OtherConst>& y);
  };
}

Klassentemplate std::ranges::chunk_view für input_range s

namespace std::ranges {
  template<class I>
  constexpr I /*div-ceil*/(I num, I denom)
  { // nur zur Darstellung
    I r = num / denom;
    if (num % denom)
      ++r;
    return r;
  }
  template<view V>
    requires input_range<V>
  class chunk_view : public view_interface<chunk_view<V>>
  {
    V /*base_*/;                              // nur zur Darstellung
    range_difference_t<V> /*n_*/;             // nur zur Darstellung
    range_difference_t<V> /*remainder_*/ = 0; // nur zur Darstellung
    /*non-propagating-cache*/<iterator_t<V>> /*current_*/; // nur zur Darstellung
    // Klasse chunk_view::outer-iterator
    class /*outer-iterator*/; // nur zur Darstellung
    // Klasse chunk_view::inner-iterator
    class /*inner-iterator*/; // nur zur Darstellung
  public:
    constexpr explicit chunk_view(V base, range_difference_t<V> n);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr /*outer-iterator*/ begin();
    constexpr default_sentinel_t end() const noexcept;
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>;
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>;
  };
  template<class R>
  chunk_view(R&&, range_difference_t<R>) -> chunk_view<views::all_t<R>>;
}

Klassentemplate std::ranges::chunk_view::outer_iterator für input_range s

namespace std::ranges {
  template<view V>
    requires input_range<V>
  class chunk_view<V>::/*outer-iterator*/
  {
    chunk_view* /*parent_*/; // nur zur Darstellung
    constexpr explicit /*outer-iterator*/(chunk_view& parent); // nur zur Darstellung
  public:
    using iterator_concept = input_iterator_tag;
    using difference_type  = range_difference_t<V>;
    // Klasse chunk_view::outer-iterator::value_type
    struct value_type;
    /*outer-iterator*/(/*outer-iterator*/&&)            = default;
    /*outer-iterator*/& operator=(/*outer-iterator*/&&) = default;
    constexpr value_type operator*() const;
    constexpr /*outer-iterator*/& operator++();
    constexpr void operator++(int);
    friend constexpr bool operator==(const /*outer-iterator*/& x, default_sentinel_t);
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*outer-iterator*/& x)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
    friend constexpr difference_type operator-(const /*outer-iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
  };
}

Klassentemplate std::ranges::chunk_view::outer_iterator::value_type für input_range s

namespace std::ranges {
  template<view V>
    requires input_range<V>
  struct chunk_view<V>::/*outer-iterator*/::value_type : view_interface<value_type>
  {
  private:
    chunk_view* /*parent_*/; // nur zur Darstellung
    constexpr explicit value_type(chunk_view& parent); // nur zur Darstellung
  public:
    constexpr /*inner-iterator*/ begin() const noexcept;
    constexpr default_sentinel_t end() const noexcept;
    constexpr auto size() const
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
  };
}

Klassentemplate std::ranges::chunk_view::inner_iterator für input_range s

namespace std::ranges {
  template<view V>
    requires input_range<V>
  class chunk_view<V>::/*inner-iterator*/
  {
    chunk_view* /*parent_*/; // nur zur Darstellung
    constexpr explicit /*inner-iterator*/(chunk_view& parent) noexcept; // nur zur Darstellung
  public:
    using iterator_concept                              = input_iterator_tag;
    using difference_type                               = range_difference_t<V>;
    using value_type                                    = range_value_t<V>;
    /*inner-iterator*/(/*inner-iterator*/&&)            = default;
    /*inner-iterator*/& operator=(/*inner-iterator*/&&) = default;
    constexpr const iterator_t<V>& base() const&;
    constexpr range_reference_t<V> operator*() const;
    constexpr /*inner-iterator*/& operator++();
    constexpr void operator++(int);
    friend constexpr bool operator==(const /*inner-iterator*/& x, default_sentinel_t);
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*inner-iterator*/& x)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
    friend constexpr difference_type operator-(const /*inner-iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
    friend constexpr range_rvalue_reference_t<V>
    iter_move(const /*inner-iterator*/& i) noexcept(
      noexcept(ranges::iter_move(*i./*parent_*/->/*current_*/)));
    friend constexpr void
    iter_swap(const /*inner-iterator*/& x, const /*inner-iterator*/& y) noexcept(noexcept(
      ranges::iter_swap(*x./*parent_*/->/*current_*/, *y./*parent_*/->/*current_*/)))
      requires indirectly_swappable<iterator_t<V>>;
  };
}

Klassentemplate std::ranges::chunk_view für forward_range s

namespace std::ranges {
  template<view V>
    requires forward_range<V>
  class chunk_view<V> : public view_interface<chunk_view<V>>
  {
    V /*base_*/;                  // nur zur Darstellung
    range_difference_t<V> /*n_*/; // nur zur Darstellung
    // Klassen-Template chunk_view::iterator
    template<bool>
    class /*iterator*/; // nur zur Darstellung
  public:
    constexpr explicit chunk_view(V base, range_difference_t<V> n);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return /*iterator*/<false>(this, ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires forward_range<const V>
    {
      return /*iterator*/<true>(this, ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (common_range<V> && sized_range<V>) {
        auto missing = (/*n_*/ - ranges::distance(/*base_*/) % /*n_*/) % /*n_*/;
        return /*iterator*/<false>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<V> && !bidirectional_range<V>) {
        return /*iterator*/<false>(this, ranges::end(/*base_*/));
      } else {
        return default_sentinel;
      }
    }
    constexpr auto end() const
      requires forward_range<const V>
    {
      if constexpr (common_range<const V> && sized_range<const V>) {
        auto missing = (/*n_*/ - ranges::distance(/*base_*/) % /*n_*/) % /*n_*/;
        return /*iterator*/<true>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<const V> && !bidirectional_range<const V>) {
        return /*iterator*/<true>(this, ranges::end(/*base_*/));
      } else {
        return default_sentinel;
      }
    }
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>;
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>;
  };
}

Klassentemplate std::ranges::chunk_view::iterator für forward_range s

namespace std::ranges {
  template<view V>
    requires forward_range<V>
  template<bool Const>
  class chunk_view<V>::/*iterator*/
  {
    using /*Elternklasse*/ = /*vielleicht-konst*/<Const, chunk_view>; // exposition-only
    using /*Basis*/   = /*vielleicht-konstant*/<Const, V>;          // exposition-only
    iterator_t</*Basis*/> /*current_*/         = iterator_t</*Basis*/>(); // exposition-only
    sentinel_t</*Basis*/> /*end_*/             = sentinel_t</*Basis*/>(); // exposition-only
    range_difference_t</*Basis*/> /*n_*/       = 0;                      // exposition-only
    range_difference_t</*Basis*/> /*fehlend_*/ = 0;                      // exposition-only
    constexpr /*iterator*/(/*Elternklasse*/* parent,
                           iterator_t</*Basis*/> current, // exposition-only
                           range_difference_t</*Basis*/> missing = 0);
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* siehe Beschreibung */;
    using value_type = decltype(views::take(subrange(/*aktuell_*/, /*end_*/), /*n_*/));
    using difference_type = range_difference_t</*Basis*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*Basis*/>>;
    constexpr iterator_t</*Basis*/> base() const;
    constexpr value_type operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr value_type operator[](difference_type n) const
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> && three_way_comparable<iterator_t</*Basis*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Basis*/>, iterator_t</*Basis*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*Basis*/>, iterator_t</*Basis*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*Basis*/>, iterator_t</*Basis*/>>;
  };
}

Klassentemplate std::ranges::slide_view

namespace std::ranges {
  template<class V>
  concept /*slide-caches-nothing*/ =
    random_access_range<V> && sized_range<V>; // Nur zur Darstellung
  template<class V>
  concept /*slide-caches-last*/ = // Nur zur Darstellung
    !/*slide-caches-nothing*/<V> && bidirectional_range<V> && common_range<V>;
  template<class V>
  concept /*slide-caches-first*/ = // Nur zur Darstellung
    !/*slide-caches-nothing*/<V> && !/*slide-caches-last*/<V>;
  template<forward_range V>
    requires view<V>
  class slide_view : public view_interface<slide_view<V>>
  {
    V /*base_*/;                  // Nur zur Darstellung
    range_difference_t<V> /*n_*/; // Nur zur Darstellung
    // Klassen-Template slide_view::iterator
    template<bool>
    class /*iterator*/; // Nur zur Darstellung
    // Klasse slide_view::sentinel
    class /*sentinel*/; // Nur zur Darstellung
  public:
    constexpr explicit slide_view(V base, range_difference_t<V> n);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!(/*simple-view*/<V> && /*slide-caches-nothing*/<const V>));
    constexpr auto begin() const
      requires /*slide-caches-nothing*/<const V>;
    constexpr auto end()
      requires(!(/*simple-view*/<V> && /*slide-caches-nothing*/<const V>));
    constexpr auto end() const
      requires /*slide-caches-nothing*/<const V>;
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
    constexpr auto reserve_hintsize()
      requires approximately_sized_range<V>;
    constexpr auto reserve_hintsize() const
      requires approximately_sized_range<const V>;
  };
  template<class R>
  slide_view(R&&, range_difference_t<R>) -> slide_view<views::all_t<R>>;
}

Klassentemplate std::ranges::slide_view::iterator

namespace std::ranges {
  template<forward_range V>
    requires view<V>
  template<bool Const>
  class slide_view<V>::/*iterator*/
  {
    using /*Basis*/                    = /*vielleicht-konst*/<Const, V>; // exposition-only
    iterator_t</*Basis*/> /*current_*/ = iterator_t</*Basis*/>();    // exposition-only
    iterator_t</*Basis*/> /*letztes-Element_*/ =
      iterator_t</*Basis*/>(); // exposition-only
                              // nur vorhanden, wenn Basis-Modelle Slide-Caches zuerst verwenden
    range_difference_t</*Basis*/> /*n_*/ = 0; // exposition-only
    constexpr /*iterator*/(iterator_t</*Basis*/> current,
                           range_difference_t</*Basis*/> n) // exposition-only
      requires(!/*slide-caches-first*/</*Basis*/>);
    constexpr /*iterator*/(iterator_t</*Basis*/> current,
                           iterator_t</*Basis*/> last_ele, // exposition-only
                           range_difference_t</*Basis*/> n)
      requires /*slide-caches-first*/</*Basis*/>;
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* siehe Beschreibung */;
    using value_type        = decltype(views::counted(/*current_*/, /*n_*/));
    using difference_type   = range_difference_t</*Basis*/>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>>;
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Basis*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> && three_way_comparable<iterator_t</*Basis*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Basis*/>, iterator_t</*Basis*/>>;
  };
}

Klassentemplate std::ranges::slide_view::sentinel

namespace std::ranges {
  template<forward_range V>
    requires view<V>
  class slide_view<V>::/*sentinel*/
  {
    sentinel_t<V> /*end_*/ = sentinel_t<V>();           // nur zur Darstellung
    constexpr explicit /*sentinel*/(sentinel_t<V> end); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    friend constexpr bool operator==(const /*iterator*/<false>& x, const /*sentinel*/& y);
    friend constexpr range_difference_t<V> operator-(const /*iterator*/<false>& x,
                                                     const /*sentinel*/& y)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
    friend constexpr range_difference_t<V> operator-(const /*sentinel*/& y,
                                                     const /*iterator*/<false>& x)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
  };
}

Klassentemplate std::ranges::chunk_by_view

namespace std::ranges {
  template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class chunk_by_view : public view_interface<chunk_by_view<V, Pred>>
  {
    V /*base_*/ = V();               // nur zur Darstellung
    /*movable-box*/<Pred> /*pred_*/; // nur zur Darstellung
    // Klasse chunk_by_view::iterator
    class /*iterator*/; // nur zur Darstellung
  public:
    chunk_by_view()
      requires default_initializable<V> && default_initializable<Pred>
    = default;
    constexpr explicit chunk_by_view(V base, Pred pred);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr const Pred& pred() const;
    constexpr /*iterator*/ begin();
    constexpr auto end();
    constexpr iterator_t<V> /*find-next*/(iterator_t<V>); // nur zur Darstellung
    constexpr iterator_t<V> /*find-prev*/(iterator_t<V>)  // nur zur Darstellung
      requires bidirectional_range<V>;
  };
  template<class R, class Pred>
  chunk_by_view(R&&, Pred) -> chunk_by_view<views::all_t<R>, Pred>;
}

Klassentemplate std::ranges::chunk_by_view::iterator

namespace std::ranges {
  template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class chunk_by_view<V, Pred>::/*iterator*/
  {
    chunk_by_view* /*parent_*/ = nullptr;         // nur zur Darstellung
    iterator_t<V> /*current_*/ = iterator_t<V>(); // nur zur Darstellung
    iterator_t<V> /*next_*/    = iterator_t<V>(); // nur zur Darstellung
    constexpr /*iterator*/(chunk_by_view& parent,
                           iterator_t<V> current, // nur zur Darstellung
                           iterator_t<V> next);
  public:
    using value_type        = subrange<iterator_t<V>>;
    using difference_type   = range_difference_t<V>;
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* siehe Beschreibung */;
    /*iterator*/()          = default;
    constexpr value_type operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range<V>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range<V>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
  };
}

Klassentemplate std::ranges::stride_view

namespace std::ranges {
  template<input_range V>
    requires view<V>
  class stride_view : public view_interface<stride_view<V>>
  {
    V /*base_*/;                       // exposition-only
    range_difference_t<V> /*stride_*/; // exposition-only
    // Klassentemplate stride_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
  public:
    constexpr explicit stride_view(V base, range_difference_t<V> stride);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr range_difference_t<V> stride() const noexcept;
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return /*iterator*/<false>(this, ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*iterator*/<true>(this, ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (common_range<V> && sized_range<V> && forward_range<V>) {
        auto missing =
          (/*stride_*/ - ranges::distance(/*base_*/) % /*stride_*/) % /*stride_*/;
        return /*iterator*/<false>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<V> && !bidirectional_range<V>) {
        return /*iterator*/<false>(this, ranges::end(/*base_*/));
      } else {
        return default_sentinel;
      }
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (common_range<const V> && sized_range<const V> &&
                    forward_range<const V>) {
        auto missing =
          (/*stride_*/ - ranges::distance(/*base_*/) % /*stride_*/) % /*stride_*/;
        return /*iterator*/<true>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<const V> && !bidirectional_range<const V>) {
        return /*iterator*/<true>(this, ranges::end(/*base_*/));
      } else {
        return default_sentinel;
      }
    }
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>;
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>;
  };
  template<class R>
  stride_view(R&&, range_difference_t<R>) -> stride_view<views::all_t<R>>;
}

Klassentemplate std::ranges::stride_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V>
  template<bool Const>
  class stride_view<V>::/*iterator*/
  {
    using /*Elternklasse*/ = /*vielleicht-konst*/<Const, stride_view>; // exposition-only
    using /*Basis*/   = /*vielleicht-konst*/<Const, V>;           // exposition-only
    iterator_t</*Basis*/> /*current_*/         = iterator_t</*Basis*/>(); // exposition-only
    sentinel_t</*Basis*/> /*end_*/             = sentinel_t</*Basis*/>(); // exposition-only
    range_difference_t</*Basis*/> /*stride_*/  = 0;                      // exposition-only
    range_difference_t</*Basis*/> /*fehlend_*/ = 0;                      // exposition-only
    constexpr /*iterator*/(/*Elternklasse*/* parent,
                           iterator_t</*Basis*/> current, // exposition-only
                           range_difference_t</*Basis*/> missing = 0);
  public:
    using difference_type   = range_difference_t</*Basis*/>;
    using value_type        = range_value_t</*Basis*/>;
    using iterator_concept  = /* siehe Beschreibung */;
    using iterator_category = /* siehe Beschreibung */; // nicht immer vorhanden
    /*iterator*/()
      requires default_initializable<iterator_t</*Basis*/>>
    = default;
    constexpr /*iterator*/(/*iterator*/<!Const> other)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Basis*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*Basis*/>>;
    constexpr iterator_t</*Basis*/> base() &&;
    constexpr const iterator_t</*Basis*/>& base() const& noexcept;
    constexpr decltype(auto) operator*() const { return */*current_*/; }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Basis*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Basis*/>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires random_access_range</*Basis*/>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires random_access_range</*Basis*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Basis*/>
    {
      return *(*this + n);
    }
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*Basis*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Basis*/> && three_way_comparable<iterator_t</*Basis*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& x)
      requires random_access_range</*Basis*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type n)
      requires random_access_range</*Basis*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Basis*/>, iterator_t</*Basis*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*Basis*/>, iterator_t</*Basis*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*Basis*/>, iterator_t</*Basis*/>>;
    friend constexpr range_rvalue_reference_t</*Basis*/> iter_move(
      const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/)));
    friend constexpr void iter_swap(
      const /*iterator*/& x,
      const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/,
                                                                 y./*current_*/)))
      requires indirectly_swappable<iterator_t</*Basis*/>>;
  };
}

Klassentemplate std::ranges::cartesian_product_view

namespace std::ranges {
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-random-access*/ = // exposition-only
    (random_access_range</*vielleicht-konst*/<Const, First>> && ... &&
     (random_access_range</*vielleicht-konst*/<Const, Vs>> &&
      sized_range</*vielleicht-konst*/<Const, Vs>>));
  template<class R>
  concept /*Kartesisches-Produkt-gemeinsames-Argument*/ = // exposition-only
    common_range<R> || (sized_range<R> && random_access_range<R>);
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-bidirectional*/ = // exposition-only
    (bidirectional_range</*vielleicht-konst*/<Const, First>> && ... &&
     (bidirectional_range</*vielleicht-konst*/<Const, Vs>> &&
      /*Kartesisches-Produkt-gemeinsames-Argument*/</*vielleicht-konst*/<Const, Vs>>));
  template<class First, class...>
  concept /*Kartesisches Produkt ist üblich*/ = // exposition-only
    /*Kartesisches-Produkt-gemeinsames-Argument*/<First>;
  template<class... Vs>
  concept /*Kartesisches-Produkt-ist-größengenormt*/ = // exposition-only
    (sized_range<Vs> && ...);
  template<bool Const, template<class> class FirstSent, class First, class... Vs>
  concept /*kartesisch-ist-groessenabgestimmter-Sentinel*/ = // exposition-only
    (sized_sentinel_for<FirstSent</*vielleicht-konst*/<Const, First>>,
                        iterator_t</*vielleicht-konst*/<Const, First>>> &&
     ... &&
     (sized_range</*vielleicht-konst*/<Const, Vs>> &&
      sized_sentinel_for<iterator_t</*vielleicht-konst*/<Const, Vs>>,
                         iterator_t</*vielleicht-konst*/<Const, Vs>>>));
  template</*Kartesisches-Produkt-gemeinsames-Argument*/ R>
  constexpr auto /*cartesian-common-arg-end*/(R& r)
  { // exposition-only
    if constexpr (common_range<R>) {
      return ranges::end(r);
    } else {
      return ranges::begin(r) + ranges::distance(r);
    }
  }
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  class cartesian_product_view
    : public view_interface<cartesian_product_view<First, Vs...>>
  {
  private:
    tuple<First, Vs...> /*bases_*/; // exposition-only
    // Klassentemplate cartesian_product_view::iterator
    template<bool Const>
    class /*iterator*/; // exposition-only
  public:
    constexpr cartesian_product_view() = default;
    constexpr explicit cartesian_product_view(First first_base, Vs... Basisklassen);
    constexpr /*iterator*/<false> begin()
      requires(!/*simple-view*/<First> || ... || !/*simple-view*/<Vs>);
    constexpr /*iterator*/<true> begin() const
      requires(range<const First> && ... && range<const Vs>);
    constexpr /*iterator*/<false> end()
      requires((!/*simple-view*/<First> || ... || !/*simple-view*/<Vs>) &&
               /*Kartesisches Produkt ist üblich*/<First, Vs...>);
    constexpr /*iterator*/<true> end() const
      requires /*Kartesisches Produkt ist üblich*/<const First, const Vs...>;
    constexpr default_sentinel_t end() const noexcept;
    constexpr /* siehe Beschreibung */ size()
      requires /*Kartesisches-Produkt-ist-größengenormt*/<First, Vs...>;
    constexpr /* siehe Beschreibung */ size() const
      requires /*Kartesisches-Produkt-ist-größengenormt*/<const First, const Vs...>;
  };
  template<class... Vs>
  cartesian_product_view(Vs&&...) -> cartesian_product_view<views::all_t<Vs>...>;
}

Klassentemplate std::ranges::cartesian_product_view::iterator

namespace std::ranges {
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  template<bool Const>
  class cartesian_product_view<First, Vs...>::/*iterator*/
  {
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* siehe Beschreibung */;
    using value_type        = tuple<range_value_t</*vielleicht-konst*/<Const, First>>,
                             range_value_t</*vielleicht-konst*/<Const, Vs>>...>;
    using reference         = tuple<range_reference_t</*vielleicht-konst*/<Const, First>>,
                            range_reference_t</*vielleicht-konst*/<Const, Vs>>...>;
    using difference_type   = /* siehe Beschreibung */;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && (convertible_to<iterator_t<First>, iterator_t<const First>> &&
                         ... && convertible_to<iterator_t<Vs>, iterator_t<const Vs>>);
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*vielleicht-konst*/<Const, First>>;
    constexpr /*iterator*/& operator--()
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*iterator*/ operator--(int)
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    constexpr reference operator[](difference_type n) const
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*vielleicht-konst*/<Const, First>>>;
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires /*kartesisch-ist-groessenabgrenzer*/<Const, iterator_t, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterator*/& i, default_sentinel_t)
      requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterator*/& i)
      requires /*kartesisch-ist-groessenabgestimmter-Sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      /* siehe Beschreibung */);
    friend constexpr void iter_swap(const /*iterator*/& l,
                                    const /*iterator*/& r) noexcept(/* siehe Beschreibung */)
      requires(indirectly_swappable<iterator_t</*vielleicht-konst*/<Const, First>>> && ... &&
               indirectly_swappable<iterator_t</*vielleicht-konst*/<Const, Vs>>>);
  private:
    using /*Eltern*/ = /*vielleicht-konst*/<Const, cartesian_product_view>; // exposition-only
    /*Eltern*/* /*parent_*/ = nullptr;                                 // exposition-only
    tuple<iterator_t</*vielleicht-konst*/<Const, First>>,
          iterator_t</*vielleicht-konst*/<Const, Vs>>...>
      /*aktuell_*/; // exposition-only
    template<size_t N = sizeof...(Vs)>
    constexpr void /*nächste*/(); // exposition-only
    template<size_t N = sizeof...(Vs)>
    constexpr void /*vorher*/(); // exposition-only
    template<class Tuple>
    constexpr difference_type /*distance-from*/(const Tuple& t) const; // exposition-only
    constexpr /*iterator*/(
      /*Eltern*/& parent,
      tuple<iterator_t</*vielleicht-konstant*/<Const, First>>,
            iterator_t</*vielleicht-konstant*/<Const, Vs>>...> current); // exposition-only
  };
}

Klassentemplate std::ranges::cache_latest_view

namespace std::ranges {
  template<input_range V>
    requires view<V>
  class cache_latest_view : public view_interface<cache_latest_view<V>>
  {
    V /*base_*/ = V(); // nur zur Darstellung
    using /*cache-t*/ =
      conditional_t<is_reference_v<range_reference_t<V>>, // nur zur Darstellung
                    add_pointer_t<range_reference_t<V>>,
                    range_reference_t<V>>;
    /*non-propagating-cache*/</*cache-t*/> /*cache_*/; // nur zur Darstellung
    // Klasse cache_latest_view::iterator
    class /*iterator*/; // nur zur Darstellung
    // Klasse cache_latest_view::sentinel
    class /*sentinel*/; // nur zur Darstellung
  public:
    cache_latest_view()
      requires default_initializable<V>
    = default;
    constexpr explicit cache_latest_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin();
    constexpr auto end();
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
  };
  template<class R>
  cache_latest_view(R&&) -> cache_latest_view<views::all_t<R>>;
}

Klassentemplate std::ranges::cache_latest_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V>
  class cache_latest_view<V>::/*iterator*/
  {
    cache_latest_view* /*parent_*/; // nur zur Darstellung
    iterator_t<V> /*current_*/;     // nur zur Darstellung
    constexpr explicit /*iterator*/(cache_latest_view& parent); // nur zur Darstellung
  public:
    using difference_type                   = range_difference_t<V>;
    using value_type                        = range_value_t<V>;
    using iterator_concept                  = input_iterator_tag;
    /*iterator*/(/*iterator*/&&)            = default;
    /*iterator*/& operator=(/*iterator*/&&) = default;
    constexpr iterator_t<V> base() &&;
    constexpr const iterator_t<V>& base() const& noexcept;
    constexpr range_reference_t<V>& operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    friend constexpr range_rvalue_reference_t<V> iter_move(
      const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/)));
    friend constexpr void iter_swap(
      const /*iterator*/& x,
      const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/,
                                                                 y./*current_*/)))
      requires indirectly_swappable<iterator_t<V>>;
  };
}

Klassentemplate std::ranges::cache_latest_view::sentinel

namespace std::ranges {
  template<input_range V>
    requires view<V>
  class cache_latest_view<V>::/*sentinel*/
  {
    sentinel_t<V> /*end_*/ = sentinel_t<V>(); // nur zur Darstellung
    constexpr explicit /*sentinel*/(cache_latest_view& parent); // nur zur Darstellung
  public:
    /*sentinel*/() = default;
    constexpr sentinel_t<V> base() const;
    friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y);
    friend constexpr range_difference_t<V> operator-(const /*iterator*/& x,
                                                     const /*sentinel*/& y)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
    friend constexpr range_difference_t<V> operator-(const /*sentinel*/& x,
                                                     const /*iterator*/& y)
      requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
  };
}

Klassentemplate std::ranges::to_input_view

namespace std::ranges {
  template<input_range V>
    requires view<V>
  class to_input_view : public view_interface<to_input_view<V>>
  {
    V /*base_*/ = V(); // nur zur Darstellung
    // Klassentemplate to_input_view::iterator
    template<bool Const>
    class /*iterator*/; // nur zur Darstellung
  public:
    to_input_view()
      requires default_initializable<V>
    = default;
    constexpr explicit to_input_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*simple-view*/<V>);
    constexpr auto begin() const
      requires range<const V>;
    constexpr auto end()
      requires(!/*simple-view*/<V>);
    constexpr auto end() const
      requires range<const V>;
    constexpr auto size()
      requires sized_range<V>;
    constexpr auto size() const
      requires sized_range<const V>;
  };
  template<class R>
  to_input_view(R&&) -> to_input_view<views::all_t<R>>;
}

Klassentemplate std::ranges::to_input_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V>
  template<bool Const>
  class to_input_view<V>::/*iterator*/
  {
    using /*Base*/                    = /*maybe-const*/<Const, V>; // nur zur Darstellung
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // nur zur Darstellung
    constexpr explicit /*iterator*/(iterator_t</*Base*/> current); // nur zur Darstellung
  public:
    using difference_type  = range_difference_t</*Base*/>;
    using value_type       = range_value_t</*Base*/>;
    using iterator_concept = input_iterator_tag;
    /*iterator*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    /*iterator*/(/*iterator*/&&)            = default;
    /*iterator*/& operator=(/*iterator*/&&) = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr iterator_t</*Base*/> base() &&;
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr decltype(auto) operator*() const { return */*current_*/; }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    friend constexpr bool operator==(const /*iterator*/& x,
                                     const sentinel_t</*Base*/>& y);
    friend constexpr difference_type operator-(const sentinel_t</*Base*/>& y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const sentinel_t</*Base*/>& y)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr range_rvalue_reference_t</*Base*/> iter_move(
      const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/)));
    friend constexpr void iter_swap(
      const /*iterator*/& x,
      const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/,
                                                                 y./*current_*/)))
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3914 C++23 die Constraint von std::ranges::enumerate_view
war in der Synopsis falsch spezifiziert
korrigiert