Namespaces
Variants

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

From cppreference.net
Standard library headers

Cet en-tête fait partie de la bibliothèque ranges .

Table des matières

Alias de namespace

namespace std {

namespace views = ranges :: views ;

}
La traduction est identique au code source fourni car : - Toutes les balises HTML et attributs sont préservés - Le contenu dans les balises ` ` (qui équivaut à du code) n'est pas traduit - Les termes spécifiques au C++ (`namespace`, `std`, `views`, `ranges`) ne sont pas traduits - La structure et le formatage originaux sont maintenus

L'alias d'espace de noms std::views est fourni comme raccourci pour std::ranges::views .

Inclusions

(C++20)
Opérateur de comparaison à trois voies support
std::initializer_list modèle de classe
Itérateurs de plage

Concepts

Concepts de plage
Défini dans l'espace de noms std::ranges
spécifie qu'un type est une plage, c'est-à-dire qu'il fournit un itérateur begin et un sentinelle end
(concept)
spécifie qu'un type est une range et que les itérateurs obtenus à partir d'une expression de celui-ci peuvent être retournés en toute sécurité sans risque de dangling
(concept)
spécifie qu'une plage peut estimer sa taille en temps constant
(concept)
spécifie qu'une gamme connaît sa taille en temps constant
(concept)
spécifie qu'une plage est une vue, c'est-à-dire qu'elle possède des opérations de copie/déplacement/assignation en temps constant
(concept)
spécifie une gamme dont le type d'itérateur satisfait input_iterator
(concept)
spécifie une plage dont le type d'itérateur satisfait output_iterator
(concept)
spécifie une gamme dont le type d'itérateur satisfait forward_iterator
(concept)
spécifie un intervalle dont le type d'itérateur satisfait bidirectional_iterator
(concept)
spécifie une plage dont le type d'itérateur satisfait random_access_iterator
(concept)
spécifie une gamme dont le type d'itérateur satisfait contiguous_iterator
(concept)
spécifie qu'une plage possède des types d'itérateur et de sentinelle identiques
(concept)
spécifie les exigences pour qu'un range puisse être converti de manière sûre en une view
(concept)
spécifie qu'une plage possède des éléments en lecture seule
(concept)

Fonctions

Conversions de plage
Défini dans l'espace de noms std::ranges
(C++23)
construit un nouvel objet non-vue à partir d'une plage d'entrée
(modèle de fonction)

Classes

Primitives de plage
Défini dans l'espace de noms std::ranges
obtient les types d'itérateur et de sentinelle d'une plage
(alias de modèle)
obtient les types de taille, différence et valeur d'une plage
(alias de modèle)
obtient les types de référence d'une plage
(modèle d'alias)
Vues
Défini dans l'espace de noms std::ranges
classe modèle utilitaire pour définir une view , utilisant le motif de modèle récurrent curieux
(classe modèle)
combine une paire itérateur-sentinelle en une view
(modèle de classe)
Gestion des itérateurs pendants
Défini dans l'espace de noms std::ranges
un type de substitution indiquant qu'un itérateur ou un subrange ne devrait pas être retourné car il serait suspendu
(classe)
obtient le type d'itérateur ou le type subrange d'un borrowed_range
(alias de modèle)
Autres utilitaires
Défini dans l'espace de noms std::ranges
étiquette une plage pour être traitée comme une séquence plutôt qu'une valeur unique
(modèle de classe)
Usines
Défini dans l'espace de noms std::ranges
une view vide sans éléments
(modèle de classe) (modèle de variable)
une view qui contient un seul élément d'une valeur spécifiée
(modèle de classe) (objet de point de personnalisation)
une view constituée d'une séquence générée en incrémentant répétitivement une valeur initiale
(modèle de classe) (objet de point de personnalisation)
une view constituée d'une séquence générée en produisant répétitivement la même valeur
(modèle de classe) (objet point de personnalisation)
une view constituée des éléments obtenus par application successive de operator>> sur le flux d'entrée associé
(modèle de classe) (objet de point de personnalisation)
Adaptateurs
Défini dans l'espace de noms std::ranges
classe de base d'assistance pour définir un objet de fermeture d'adaptateur de plage
(modèle de classe)
une view qui inclut tous les éléments d'une range
(alias de modèle) (objet adaptateur de gamme)
une view des éléments d'une autre range
(modèle de classe)
une view avec propriété exclusive d'une certaine range
(modèle de classe)
une view d'une séquence qui convertit chaque élément en une rvalue
(modèle de classe) (objet adaptateur de gamme)
une view qui consiste en les éléments d'un range qui satisfait un prédicat
(modèle de classe) (objet adaptateur de gamme)
une view d'une séquence qui applique une fonction de transformation à chaque élément
(modèle de classe) (objet adaptateur de gamme)
une view composée des N premiers éléments d'une autre view
(modèle de classe) (objet adaptateur de gamme)
une view composée des éléments initiaux d'une autre view , jusqu'au premier élément pour lequel un prédicat retourne false
(modèle de classe) (objet adaptateur de gamme)
une view composée d'éléments d'une autre view , ignorant les N premiers éléments
(modèle de classe) (objet adaptateur de plage)
une view constituée des éléments d'une autre view , ignorant la sous-séquence initiale d'éléments jusqu'au premier élément où le prédicat retourne false
(modèle de classe) (objet adaptateur de gamme)
une view constituée de la séquence obtenue en aplatissant une view de range s
(modèle de classe) (objet adaptateur de gamme)
une view constituée de la séquence obtenue en aplatissant une vue de plages, avec le délimiteur entre les éléments
(modèle de classe) (objet adaptateur de plage)
une view sur les sous-intervalles obtenus en divisant une autre view en utilisant un délimiteur
(modèle de classe) (objet adaptateur de plage)
une view sur les sous-intervalles obtenus en divisant une autre view en utilisant un délimiteur
(modèle de classe) (objet adaptateur de gamme)
une view constituée de la concaténation des vues adaptées
(modèle de classe) (objet de point de personnalisation)
crée un sous-intervalle à partir d'un itérateur et d'un compteur
(objet de point de personnalisation)
convertit une view en une common_range
(modèle de classe) (objet adaptateur de gamme)
une view qui itère sur les éléments d'une autre vue bidirectionnelle en ordre inverse
(modèle de classe) (objet adaptateur de gamme)
convertit une view en une constant_range
(modèle de classe) (objet adaptateur de plage)
prend une view constituée de valeurs tuple-like et un nombre N, et produit une view du N ème élément de chaque tuple
(modèle de classe) (objet adaptateur de gamme)
prend une view constituée de valeurs de type paire et produit une view des premiers éléments de chaque paire
(modèle de classe) (objet adaptateur de gamme)
prend une view constituée de valeurs de type paire et produit une view des deuxièmes éléments de chaque paire
(modèle de classe) (objet adaptateur de gamme)
une view qui associe chaque élément de la séquence adaptée à un tuple contenant à la fois la position de l'élément et sa valeur
(modèle de classe) (objet adaptateur de gamme)
une view constituée de tuples de références aux éléments correspondants des vues adaptées
(modèle de classe) (objet de point de personnalisation)
une view composée des résultats de l'application d'une fonction de transformation aux éléments correspondants des vues adaptées
(modèle de classe) (objet de point de personnalisation)
une view constituée de tuples de références aux éléments adjacents de la vue adaptée
(modèle de classe) (objet adaptateur de gamme)
une view constituée des résultats de l'application d'une fonction de transformation aux éléments adjacents de la vue adaptée
(modèle de classe) (objet adaptateur de plage)
une plage de view s qui sont des segments successifs non chevauchants de taille N des éléments d'une autre view
(modèle de classe) (objet adaptateur de plage)
une view dont le M ième élément est une view sur les M ième à (M + N - 1) ième éléments d'une autre view
(modèle de classe) (objet adaptateur de gamme)
divise la view en sous-intervalles entre chaque paire d'éléments adjacents pour lesquels le prédicat donné retourne false
(modèle de classe) (objet adaptateur de gamme)
une view constituée d'éléments d'une autre view , avançant de N éléments à la fois
(modèle de classe) (objet adaptateur de plage)
une view constituée de tuples de résultats calculés par le produit cartésien n-aire des vues adaptées
(modèle de classe) (objet de point de personnalisation)
une view qui met en cache le dernier élément accédé de sa séquence sous-jacente
(modèle de classe) (objet adaptateur de plage)
convertit une view en une plage qui est input_range uniquement et non common_range
(modèle de classe) (objet adaptateur de plage)

Objets de point de personnalisation

Accès aux plages
Défini dans l'espace de noms std::ranges
retourne un itérateur vers le début d'une plage
(objet de point de personnalisation)
retourne un sentinelle indiquant la fin d'une plage
(objet de point de personnalisation)
retourne un itérateur vers le début d'une plage en lecture seule
(objet de point de personnalisation)
retourne un sentinelle indiquant la fin d'une plage en lecture seule
(objet de point de personnalisation)
retourne un itérateur inverse vers un intervalle
(objet de point de personnalisation)
retourne un itérateur de fin inverse pour une plage
(objet de point de personnalisation)
retourne un itérateur inverse vers une plage en lecture seule
(objet de point de personnalisation)
retourne un itérateur inverse de fin vers une plage en lecture seule
(objet de point de personnalisation)
retourne un entier égal à l'indication de réserve fournie par un intervalle
(objet de point de personnalisation)
retourne un entier égal à la taille d'un intervalle
(objet point de personnalisation)
retourne un entier signé égal à la taille d'un intervalle
(objet de point de personnalisation)
vérifie si une plage est vide
(objet de point de personnalisation)
obtient un pointeur vers le début d'une plage contiguë
(objet de point de personnalisation)
obtient un pointeur vers le début d'une plage contiguë en lecture seule
(objet de point de personnalisation)

Énumérations

Défini dans l'espace de noms std::ranges
spécifie si un std::ranges::subrange modélise std::ranges::sized_range
(énumération)

Aides

obtient la taille d'un std::ranges::subrange
(spécialisation de modèle de classe)
obtient le type de l'itérateur ou du sentinelle d'un std::ranges::subrange
(spécialisation de modèle de classe)
obtient un itérateur ou un sentinelle d'un std::ranges::subrange
(modèle de fonction)
étiquette de construction from-range
(étiquette)

Synopsis

// principalement autonome
#include <compare>
#include <initializer_list>
#include <iterator>
namespace std::ranges {
  inline namespace /* non spécifié */ {
    // accès aux plages
    inline constexpr /* non spécifié */ begin        = /* non spécifié */;
    inline constexpr /* non spécifié */ end          = /* non spécifié */;
    inline constexpr /* non spécifié */ cbegin       = /* non spécifié */;
    inline constexpr /* non spécifié */ cend         = /* non spécifié */;
    inline constexpr /* non spécifié */ rbegin       = /* non spécifié */;
    inline constexpr /* non spécifié */ rend         = /* non spécifié */;
    inline constexpr /* non spécifié */ crbegin      = /* non spécifié */;
    inline constexpr /* non spécifié */ crend        = /* non spécifié */;
    inline constexpr /* non spécifié */ size         = /* non spécifié */;
    inline constexpr /* non spécifié */ reserve_hint = /* non spécifié */;
    inline constexpr /* non spécifié */ ssize        = /* non spécifié */;
    inline constexpr /* non spécifié */ empty        = /* non spécifié */;
    inline constexpr /* non spécifié */ data         = /* non spécifié */;
    inline constexpr /* non spécifié */ cdata        = /* non spécifié */;
  }
  // plages
  template<class T>
  concept range = /* voir description */;
  template<class T>
  constexpr bool enable_borrowed_range = false;
  template<class T>
  concept borrowed_range = /* voir description */;
  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>>;
  // plages dimensionnées
  template<class>
  constexpr bool disable_sized_range = false;
  template<class T>
  concept approximately_sized_range = /* voir description */;
  template<class T>
  concept sized_range = /* voir description */;
  // vues
  template<class T>
  constexpr bool enable_view = /* voir description */;
  struct view_base
  {};
  template<class T>
  concept view = /* voir description */;
  // autres affinements de plage
  template<class R, class T>
  concept output_range = /* voir description */;
  template<class T>
  concept input_range = /* voir description */;
  template<class T>
  concept forward_range = /* voir description */;
  template<class T>
  concept bidirectional_range = /* voir description */;
  template<class T>
  concept random_access_range = /* voir description */;
  template<class T>
  concept contiguous_range = /* voir description */;
  template<class T>
  concept common_range = /* voir description */;
  template<class T>
  concept viewable_range = /* voir description */;
  template<class T>
  concept constant_range = /* voir description */;
  // modèle de classe view_interface
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class view_interface;
  // sous-intervalles
  enum class subrange_kind : bool
  {
    unsized,
    sized
  };
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K =
             /* voir description */>
    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 {
  // gestion des itérateurs pendants
  struct dangling;
  // modèle de classe elements_of
  template<range R, class Allocator = allocator<byte>>
  struct elements_of; // hébergé
  template<range R>
  using borrowed_iterator_t = /* voir description */;
  template<range R>
  using borrowed_subrange_t = /* voir description */;
  // conversions de plages
  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);
  // vue vide
  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{};
  }
  // vue unique
  template<move_constructible T>
    requires is_object_v<T>
  class single_view;
  namespace views {
    inline constexpr /* non spécifié */ single = /* non spécifié */;
  }
  template<bool Const, class T>
  using /*peut-être-const*/ = conditional_t<Const, const T, T>; // exposition uniquement
  // vue iota
  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 /* non spécifié */ iota = /* non spécifié */;
  }
  // vue répétée
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
    requires /* voir description */
  class repeat_view;
  namespace views {
    inline constexpr /* non spécifié */ repeat = /* non spécifié */;
  }
  // vue istream
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
    requires                /* voir description */
  class basic_istream_view; // hébergé
  template<class Val>
  using istream_view = basic_istream_view<Val, char>; // hébergé
  template<class Val>
  using wistream_view = basic_istream_view<Val, wchar_t>; // hébergé
  namespace views {
    template<class T>
    constexpr /* non spécifié */ istream = /* non spécifié */; // hébergé
  }
  // objets adaptateurs de plage
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class range_adaptor_closure
  {};
  // vue globale
  namespace views {
    inline constexpr /* non spécifié */ all = /* non spécifié */;
    template<viewable_range R>
    using all_t = decltype(all(declval<R>()));
  }
  // vue de référence
  template<range R>
    requires is_object_v<R>
  class ref_view;
  template<class T>
  constexpr bool enable_borrowed_range<ref_view<T>> = true;
  // vue propriétaire
  template<range R>
    requires /* voir description */
  class owning_view;
  template<class T>
  constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>;
  // en tant que vue rvalue
  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 /* non spécifié */ as_rvalue = /* non spécifié */;
  }
  // vue de filtre
  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 /* non spécifié */ filter = /* non spécifié */;
  }
  // vue de transformation
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*peut-être référencé*/<invoke_result_t<F&, range_reference_t<V>>>
  class transform_view;
  namespace views {
    inline constexpr /* non spécifié */ transform = /* non spécifié */;
  }
  // prendre la vue
  template<view>
  class take_view;
  template<class T>
  constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* non spécifié */ take = /* non spécifié */;
  }
  // prendre tant que vue
  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 /* non spécifié */ take_while = /* non spécifié */;
  }
  // supprimer la vue
  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 /* non spécifié */ drop = /* non spécifié */;
  }
  // vue drop while
  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 /* non spécifié */ drop_while = /* non spécifié */;
  }
  // vue de jointure
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view;
  namespace views {
    inline constexpr /* non spécifié */ join = /* non spécifié */;
  }
  // joindre avec vue
  template<input_range V, forward_range Pattern>
    requires /* voir description */
  class join_with_view;
  namespace views {
    inline constexpr /* non spécifié */ join_with = /* non spécifié */;
  }
  // vue de division paresseuse
  template<class R>
  concept /*tiny-range*/ = /* voir description */; // exposition uniquement
  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;
  // vue fractionnée
  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 /* non spécifié */ lazy_split = /* non spécifié */;
    inline constexpr /* non spécifié */ split      = /* non spécifié */;
  }
  // vue de concaténation
  template<input_range... Vues>
    requires /* voir description */
  class concat_view;
  namespace views {
    inline constexpr /* non spécifié */ concat = /* non spécifié */;
  }
  // vue comptée
  namespace views {
    inline constexpr /* non spécifié */ counted = /* non spécifié */;
  }
  // vue commune
  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 /* non spécifié */ common = /* non spécifié */;
  }
  // vue inversée
  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 /* non spécifié */ reverse = /* non spécifié */;
  }
  // en tant que vue const
  template<input_range R>
  constexpr auto& /*possibly-const-range*/(R& r) noexcept
  { // exposition uniquement
    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 /* non spécifié */ as_const = /* non spécifié */;
  }
  // vue des éléments
  template<input_range V, size_t N>
    requires /* voir description */
  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 /* non spécifié */ elements = /* non spécifié */;
    inline constexpr auto keys           = elements<0>;
    inline constexpr auto values         = elements<1>;
  }
  // énumérer la vue
  template<view V>
    requires /* voir description */
  class enumerate_view;
  template<class View>
  constexpr bool enable_borrowed_range<enumerate_view<View>> =
    enable_borrowed_range<View>;
  namespace views {
    inline constexpr /* non spécifié */ enumerate = /* non spécifié */;
  }
  // vue zip
  template<input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view;
  template<class... Vues>
  constexpr bool enable_borrowed_range<zip_view<Views...>> =
    (enable_borrowed_range<Views> && ...);
  namespace views {
    inline constexpr /* non spécifié */ zip = /* non spécifié */;
  }
  // vue de transformation zip
  template<move_constructible F, input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*peut-être référencé*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view;
  namespace views {
    inline constexpr /* non spécifié */ zip_transform = /* non spécifié */;
  }
  // vue adjacente
  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 /* non spécifié */ adjacent = /* non spécifié */;
    inline constexpr auto pairwise       = adjacent<2>;
  }
  // vue de transformation adjacente
  template<forward_range V, move_constructible F, size_t N>
    requires /* voir description */
  class adjacent_transform_view;
  namespace views {
    template<size_t N>
    constexpr /* non spécifié */ adjacent_transform = /* non spécifié */;
    inline constexpr auto pairwise_transform       = adjacent_transform<2>;
  }
  // vue des segments
  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 /* non spécifié */ chunk = /* non spécifié */;
  }
  // vue de diapositive
  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 /* non spécifié */ slide = /* non spécifié */;
  }
  // morceau par vue
  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 /* non spécifié */ chunk_by = /* non spécifié */;
  }
  // vue de foulée
  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 /* non spécifié */ stride = /* non spécifié */;
  }
  // vue de produit cartésien
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  class cartesian_product_view;
  namespace views {
    inline constexpr /* non spécifié */ cartesian_product = /* non spécifié */;
  }
  // cache la vue la plus récente
  template<input_range V>
    requires view<V>
  class cache_latest_view;
  namespace views {
    inline constexpr /* non spécifié */ cache_latest = /* non spécifié */;
  }
  // vers l'entrée de vue
  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 /* non spécifié */ to_input = /* non spécifié */;
  }
}
namespace std {
  namespace views = ranges::vues;
  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{};
}

Concept range

namespace std::ranges {
  template<class T>
  concept range = requires(T& t) {
    ranges::begin(t); // parfois préservant l'égalité (voir description)
    ranges::end(t);
  };
}

Concept 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>>);
}
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++. Seul le texte environnant aurait été traduit s'il y en avait eu.

Concept approximately_sized_range

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

Concept sized_range

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

Concept view

namespace std::ranges {
  template<class T>
  constexpr bool /*is-derived-from-view-interface*/ =
    /* voir description */; // exposition uniquement
  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>;
}

Concept output_range

namespace std::ranges {
  template<class R, class T>
  concept output_range = range<R> && output_iterator<iterator_t<R>, T>;
}
Le code C++ reste inchangé comme demandé. Le texte environnant a été traduit en français selon les instructions.

Concept input_range

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

Concept forward_range

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

Concept bidirectional_range

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

Concept random_access_range

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

Concept contiguous_range

namespace std::ranges {
  template<class T>
  concept plage_contigue =
    plage_acces_aleatoire<T> && iterateur_contigu<iterator_t<T>> && requires(T& t) {
      {
        ranges::data(t)
      } -> same_as<add_pointer_t<range_reference_t<T>>>;
    };
}
**Traductions effectuées :** - `contiguous_range` → `plage_contigue` - `random_access_range` → `plage_acces_aleatoire` - `contiguous_iterator` → `iterateur_contigu` **Éléments préservés :** - Toutes les balises HTML et leurs attributs - Le code C++ dans les balises `
` et ``
- Les termes spécifiques au C++ (`template`, `concept`, `requires`, `same_as`, etc.)
- La structure et le formatage original

Concept common_range

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

Concept 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>))));
}
*Note: Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant aurait été traduit s'il y en avait eu.*

Concept constant_range

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

Concepts auxiliaires

Note : Les concepts dans cette section sont uniquement à titre d'exposition et ne font pas partie de l'interface.

namespace std::ranges { // non spécifié, pour la recherche de nom uniquement
  template<class R>
  concept /*simple-view*/ = // exposition uniquement
    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*/ = // exposition uniquement
    input_iterator<I> && (is_pointer_v<I> || requires(const I i) { i.operator->(); });
  template<class T, class U>
  concept /*different-from*/ = // exposition uniquement
    !same_as<remove_cvref_t<T>, remove_cvref_t<U>>;
  template<class R>
  concept /*range-with-movable-references*/ = // exposition uniquement
    input_range<R> && move_constructible<range_reference_t<R>> &&
    move_constructible<range_rvalue_reference_t<R>>;
  template<class R>
  constexpr bool /*is-initializer-list*/ = /* voir description */; // exposition uniquement
  template<class T>
  constexpr auto
  /*as-const-pointer*/(const T* p) noexcept
  {
    return p;
  } // exposition uniquement
}

Modèle de classe 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& /*dérivé*/() noexcept
    { // exposition uniquement
      return static_cast<D&>(*this);
    }
    constexpr const D& /*dérivé*/() const noexcept
    { // exposition uniquement
      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(/*dérivé*/()) == 0;
      else
        return ranges::begin(/*dérivé*/()) == ranges::end(/*dérivé*/());
    }
    constexpr bool empty() const
      requires sized_range<const D> || forward_range<const D>
    {
      if constexpr (sized_range<const D>)
        return ranges::size(/*dérivé*/()) == 0;
      else
        return ranges::begin(/*dérivé*/()) == ranges::end(/*dérivé*/());
    }
    constexpr auto cbegin()
      requires input_range<D>
    {
      return ranges::cbegin(/*dérivé*/());
    }
    constexpr auto cbegin() const
      requires input_range<const D>
    {
      return ranges::cbegin(/*dérivé*/());
    }
    constexpr auto cend()
      requires input_range<D>
    {
      return ranges::cend(/*dérivé*/());
    }
    constexpr auto cend() const
      requires input_range<const D>
    {
      return ranges::cend(/*dérivé*/());
    }
    constexpr explicit operator bool()
      requires requires { ranges::empty(/*dérivé*/()); }
    {
      return !ranges::empty(/*dérivé*/());
    }
    constexpr explicit operator bool() const
      requires requires { ranges::empty(/*dérivé*/()); }
    {
      return !ranges::empty(/*dérivé*/());
    }
    constexpr auto data()
      requires contiguous_iterator<iterator_t<D>>
    {
      return to_address(ranges::begin(/*dérivé*/()));
    }
    constexpr auto data() const
      requires range<const D> && contiguous_iterator<iterator_t<const D>>
    {
      return to_address(ranges::begin(/*dérivé*/()));
    }
    constexpr auto size()
      requires forward_range<D> && sized_sentinel_for<sentinel_t<D>, iterator_t<D>>
    {
      return /*to-unsigned-like*/(ranges::end(/*dérivé*/()) -
                                  ranges::begin(/*dérivé*/()));
    }
    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(/*dérivé*/()) -
                                  ranges::begin(/*dérivé*/()));
    }
    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(/*dérivé*/())[n];
    }
    template<random_access_range R = const D>
    constexpr decltype(auto) operator[](range_difference_t<R> n) const
    {
      return ranges::begin(/*dérivé*/())[n];
    }
  };
}

Modèle de classe std::ranges::subrange

namespace std::ranges {
  template<class From, class To>
  concept /*utilise-la-conversion-de-pointeur-sans-qualification*/ = // exposition uniquement
    is_pointer_v<From> && is_pointer_v<To> &&
    !convertible_to<remove_pointer_t<From> (*)[], remove_pointer_t<To> (*)[]>;
  template<class From, class To>
  concept /*convertible-en-non-slicing*/ = // exposition uniquement
    convertible_to<From, To> &&
    !/*utilise-la-conversion-de-pointeur-sans-qualification*/<decay_t<From>, decay_t<To>>;
  template<class T, class U, class V>
  concept /*pair-like-convertible-from*/ = // exposition uniquement
    !range<T> && !is_reference_v<T> && /*pair-like*/<T> && constructible_from<T, U, V> &&
    /*convertible-to-non-slicing*/<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 uniquement
      K == subrange_kind::sized && !sized_sentinel_for<S, I>;
    I /*begin_*/ = I(); // exposition uniquement
    S /*fin_*/   = S(); // exposition uniquement
    /*make-unsigned-like-t*/<iter_difference_t<I>> /*size_*/ =
      0; // exposition uniquement présente seulement
         // si StoreSize est vrai
  public:
    subrange()
      requires default_initializable<I>
    = default;
    constexpr subrange(/*convertible-en-non-slicing*/<I> auto i, S s)
      requires(!/*StoreSize*/);
    constexpr subrange(/*convertible-en-non-slicing*/<I> auto i,
                       S s,
                       /*make-unsigned-like-t*/<iter_difference_t<I>> n)
      requires(K == subrange_kind::sized);
    template</*différent-de*/<subrange> R>
      requires borrowed_range<R> && /*convertible-en-non-slicing*/<iterator_t<R>, I> &&
               convertible_to<sentinel_t<R>, S>
               constexpr subrange(R&& r)
                 requires(!/*StoreSize*/ || sized_range<R>);
    template<borrowed_range R>
      requires /*convertible-to-non-slicing*/<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</*différent-de*/<subrange> PairLike>
      requires /*convertible-similaire-à-une-paire*/<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>;
}

Classe std::ranges::dangling

namespace std::ranges {
  struct dangling
  {
    constexpr dangling() noexcept = default;
    constexpr dangling(auto&&...) noexcept {}
  };
}

Classe 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>;
}
La traduction a été effectuée en respectant strictement vos consignes : - Aucune balise HTML ou attribut n'a été traduit - Le contenu des balises `
` et `` est préservé intact
- Les termes spécifiques au C++ sont conservés en anglais
- La mise en forme originale est maintenue

Modèle de classe 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; }
  };
}
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant (s'il y en avait) aurait été traduit en français.

Modèle de classe 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_*/; // exposition uniquement
  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>;
}

Modèle de classe std::ranges::iota_view

namespace std::ranges {
  template<class I>
  concept /*decrementable*/ = /* voir description */; // exposition uniquement
  template<class I>
  concept /*advanceable*/ = /* voir description */; // exposition uniquement
  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:
    // classe iota_view::iterator
    struct /*iterator*/; // exposition uniquement
    // classe iota_view::sentinel
    struct /*sentinel*/; // exposition uniquement
    W /*value_*/     = W();     // exposition uniquement
    Bound /*bound_*/ = Bound(); // exposition uniquement
  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, /* voir description */ 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 /* voir description */;
  };
  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>;
}

Modèle de classe 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(); // exposition uniquement
  public:
    using iterator_concept = /* voir description */;
    using iterator_category =
      input_iterator_tag; // présent uniquement si W modélise incrementable et
                          // IOTA-DIFF-T(W) est un type intégral
    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>;
  };
}

Modèle de classe 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(); // exposition uniquement
  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>;
  };
}

Modèle de classe std::ranges::repeat_view

namespace std::ranges {
  template<class T>
  concept /*integer-like-with-usable-difference-type*/ = // exposition uniquement
    /*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:
    // classe repeat_view::iterator
    struct /*iterator*/; // exposition uniquement
    /*movable-box*/<T> /*value_*/; // exposition uniquement
    Bound /*bound_*/ = Bound();    // exposition uniquement
  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>;
}

Modèle de classe 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*/ = // exposition uniquement
      conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>;
    const T* /*value_*/         = nullptr;          // exposition uniquement
    /*index-type*/ /*current_*/ = /*index-type*/(); // exposition uniquement
    constexpr explicit /*iterator*/(
      const T* value,
      /*index-type*/ b = /*index-type*/()); // exposition uniquement
  public:
    using iterator_concept  = random_access_iterator_tag;
    using iterator_category = random_access_iterator_tag;
    using value_type        = T;
    using difference_type   = /* voir description */;
    /*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);
  };
}

Modèle de classe std::ranges::basic_istream_view

namespace std::ranges {
  template<class Val, class CharT, class Traits>
  concept /*stream-extractable*/ = // exposition-only
    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:
    // classe basic_istream_view::iterator
    struct /*iterator*/;                       // exposition-only
    basic_istream<CharT, Traits>* /*stream_*/; // exposition-only
    Val /*value_*/ = Val();                    // exposition-only
  };
}

Modèle de classe 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_*/; // exposition uniquement
  };
}
Seules les parties suivantes ont été traduites : - "exposition-only" → "exposition uniquement" Tous les autres éléments (balises HTML, code C++, termes techniques C++, commentaires dans le code) ont été conservés dans leur forme originale conformément aux instructions.

Modèle de classe 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_*/; // exposition uniquement
  public:
    template</*different-from*/<ref_view> T>
      requires /* voir description */
      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>;
}

Modèle de classe 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(); // exposition uniquement
  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_*/);
    }
  };
}

Modèle de classe 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(); // exposition uniquement
  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>>;
}

Modèle de classe 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();               // exposition uniquement
    /*movable-box*/<Pred> /*pred_*/; // exposition uniquement
    // classe filter_view::iterator
    class /*iterator*/; // exposition uniquement
    // classe filter_view::sentinel
    class /*sentinel*/; // exposition uniquement
  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>;
}

Modèle de classe 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>(); // exposition uniquement
    filter_view* /*parent_*/   = nullptr;         // exposition uniquement
  public:
    using iterator_concept  = /* voir description */;
    using iterator_category = /* voir description */; // pas toujours présent
    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>>;
  };
}

Modèle de classe 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>(); // exposition uniquement
  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);
  };
}

Modèle de classe 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:
    // modèle de classe transform_view::iterator
    template<bool>
    struct /*iterator*/; // exposition uniquement
    // modèle de classe transform_view::sentinel
    template<bool>
    struct /*sentinel*/; // exposition uniquement
    V /*base_*/ = V();           // exposition uniquement
    /*movable-box*/<F> /*fun_*/; // exposition uniquement
  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>;
}

Modèle de classe 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>> &&
             /*peut-être référencé*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*itérateur*/
  {
  private:
    using /*Parent*/ = /*peut-être const*/<Const, transform_view>;  // exposition uniquement
    using /*Base*/   = /*peut-être-const*/<Const, V>;               // exposition uniquement
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition uniquement
    /*Parent*/* /*parent_*/           = nullptr;                // exposition uniquement
  public:
    using iterator_concept  = /* voir description */;
    using iterator_category = /* voir description */; // pas toujours présent
    using value_type        = remove_cvref_t<
      invoke_result_t</*peut-être-const*/<Const, F>&, range_reference_t</*Base*/>>>;
    using difference_type = range_difference_t</*Base*/>;
    /*itérateur*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*itérateur*/(/*Parent*/& parent, iterator_t</*Base*/> current);
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr iterator_t</*Base*/> base() &&;
    constexpr decltype(auto) operator*() const
      noexcept(noexcept(invoke(*/*parent_*/->/*fun_*/, */*current_*/)))
    {
      return invoke(*/*parent_*/->/*fun_*/, */*current_*/);
    }
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return invoke(*/*parent_*/->/*fun_*/, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*itérateur*/ operator+(/*itérateur*/ i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, /*itérateur*/ i)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(/*itérateur*/ i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Modèle de classe 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>> &&
             /*peut-être référencé*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*sentinel*/
  {
  private:
    using /*Parent*/ = /*peut-être-const*/<Const, transform_view>; // exposition uniquement
    using /*Base*/   = /*peut-être-const*/<Const, V>;              // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // exposition uniquement
  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</*peut-être-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</*peut-être-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*peut-être-const*/<OtherConst, V>> operator-(
      const /*iterator*/<OtherConst>& x,
      const /*sentinel*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*Base*/>,
                                  iterator_t</*peut-être-const*/<OtherConst, V>>>
    friend constexpr range_difference_t</*peut-être-const*/<OtherConst, V>> operator-(
      const /*sentinel*/& y,
      const /*iterator*/<OtherConst>& x);
  };
}

Modèle de classe std::ranges::take_view

namespace std::ranges {
  template<view V>
  class take_view : public view_interface<take_view<V>>
  {
  private:
    V /*base_*/                      = V(); // exposition uniquement
    range_difference_t<V> /*count_*/ = 0;   // exposition uniquement
    // modèle de classe take_view::sentinel
    template<bool>
    class /*sentinelle*/; // exposition uniquement
  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 /*sentinelle*/<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 /*sentinelle*/<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<R>>;
}

Modèle de classe 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>; // exposition uniquement
    template<bool OtherConst>
    using /*CI*/ =
      counted_iterator<iterator_t</*maybe-const*/<OtherConst, V>>>; // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();         // exposition uniquement
  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);
  };
}

Modèle de classe 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>>
  {
    // modèle de classe take_while_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition uniquement
    V /*base_*/ = V();               // exposition uniquement
    /*movable-box*/<Pred> /*pred_*/; // exposition uniquement
  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>;
}

Modèle de classe 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>; // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // exposition uniquement
    const Pred* /*pred_*/         = nullptr;                // exposition uniquement
  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);
  };
}

Modèle de classe 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(); // exposition uniquement
    range_difference_t<V> /*count_*/ = 0;   // exposition uniquement
  };
  template<class R>
  drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;
}
Seules les deux lignes de commentaires ont été traduites de l'anglais vers le français : - "exposition-only" → "exposition uniquement" Tous les autres éléments (balises HTML, code C++, termes techniques C++) ont été conservés dans leur forme originale comme demandé.

Modèle de classe 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();               // exposition uniquement
    /*movable-box*/<Pred> /*pred_*/; // exposition uniquement
  };
  template<class R, class Pred>
  drop_while_view(R&&, Pred) -> drop_while_view<views::all_t<R>, Pred>;
}

Modèle de classe 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 uniquement
    // modèle de classe join_view::iterator
    template<bool Const>
    struct /*itérateur*/; // exposition uniquement
    // modèle de classe join_view::sentinel
    template<bool Const>
    struct /*sentinelle*/; // exposition uniquement
    V /*base_*/ = V(); // exposition uniquement
    /*cache-non-propagatif*/<iterator_t<V>> /*outer_*/; // exposition-only présent uniquement
                                                         // when !forward_range<V>
    /*cache-non-propagatif*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/; // exposition-only présent uniquement
                  // si is_reference_v<InnerRng> est faux
  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 /*itérateur*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer_*/ = ranges::begin(/*base_*/);
        return /*itérateur*/<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 /*itérateur*/<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 /*itérateur*/</*simple-view*/<V>>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinelle*/</*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 /*itérateur*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinelle*/<true>{ *this };
    }
  };
  template<class R>
  explicit join_view(R&&) -> join_view<views::all_t<R>>;
}

Modèle de classe 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>::/*itérateur*/
  {
  private:
    using /*Parent*/    = /*peut-être-const*/<Const, join_view>;       // exposition uniquement
    using /*Base*/      = /*peut-être-const*/<Const, V>;               // exposition uniquement
    using /*OuterIter*/ = iterator_t</*Base*/>;                    // exposition uniquement
    using /*InnerIter*/ = iterator_t<range_reference_t</*Base*/>>; // exposition uniquement
    static constexpr bool /*ref-est-glvalue*/ = // exposition uniquement
      is_reference_v<range_reference_t</*Base*/>>;
    /*OuterIter*/ /*outer_*/ = /*OuterIter*/(); // exposition-only présent uniquement
                                                // si Base modélise forward_range
    optional</*InnerIter*/> /*inner_*/;         // exposition uniquement
    /*Parent*/* /*parent_*/ = nullptr;          // exposition uniquement
    constexpr void /*satisfaire*/(); // exposition uniquement
    constexpr /*OuterIter*/& /*externe*/();             // exposition uniquement
    constexpr const /*OuterIter*/& /*externe*/() const; // exposition uniquement
    constexpr /*itérateur*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposition uniquement
    constexpr explicit /*itérateur*/(/*Parent*/& parent)
      requires(!forward_range</*Base*/>); // exposition uniquement
  public:
    using iterator_concept  = /* voir description */;
    using iterator_category = /* voir description */; // pas toujours présent
    using value_type        = range_value_t<range_reference_t</*Base*/>>;
    using difference_type   = /* voir description */;
    /*itérateur*/()          = default;
    constexpr /*itérateur*/(/*itérateur*/<!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 /*has-arrow*/</*InnerIter*/> && copyable</*InnerIter*/>;
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires /*ref-est-glvalue*/
               && forward_range</*Base*/> && forward_range<range_reference_t</*Base*/>>;
    constexpr /*itérateur*/& operator--()
      requires /*ref-est-glvalue*/ && bidirectional_range</*Base*/> &&
               bidirectional_range<range_reference_t</*Base*/>> &&
               common_range<range_reference_t</*Base*/>>;
    constexpr /*itérateur*/ operator--(int)
      requires /*ref-est-glvalue*/ && bidirectional_range</*Base*/> &&
               bidirectional_range<range_reference_t</*Base*/>> &&
               common_range<range_reference_t</*Base*/>>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*ref-est-glvalue*/ && forward_range</*Base*/> &&
               equality_comparable<iterator_t<range_reference_t</*Base*/>>>;
    friend constexpr decltype(auto) iter_move(const /*itérateur*/& i) noexcept(
      noexcept(ranges::iter_move(*i./*inner_*/)))
    {
      return ranges::iter_move(*i./*inner_*/);
    }
    friend constexpr void iter_swap(
      const /*itérateur*/& x,
      const /*itérateur*/& y) noexcept(noexcept(ranges::iter_swap(*x./*inner_*/,
                                                                 *y./*inner_*/)))
      requires indirectly_swappable</*InnerIter*/>;
  };
}

Modèle de classe 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>; // exposition uniquement
    using /*Base*/                = /*maybe-const*/<Const, V>;         // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();            // exposition uniquement
  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);
  };
}

Modèle de classe std::ranges::join_with_view

namespace std::ranges {
  template<class R>
  concept /*bidirectional-common*/ =
    bidirectional_range<R> && common_range<R>; // exposition uniquement
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>> && view<Pattern> &&
             /*concatable*/<range_reference_t<V>, Pattern>
  class join_with_view : public view_interface<join_with_view<V, Pattern>>
  {
    using /*InnerRng*/ = range_reference_t<V>; // exposition uniquement
    V /*base_*/        = V();                               // exposition uniquement
    /*cache-non-propagatif*/<iterator_t<V>> /*outer-it_*/; // exposition-only present
                                                            // seulement quand !forward_range<V>
    /*cache-non-propagateur*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/;                     // exposition-only présent uniquement
                                      // si is_reference_v<InnerRng> est faux
    Pattern /*motif_*/ = Pattern(); // exposition uniquement
    // modèle de classe join_with_view::iterator
    template<bool Const>
    struct /*itérateur*/; // exposition uniquement
    // modèle de classe join_with_view::sentinel
    template<bool Const>
    struct /*sentinelle*/; // exposition uniquement
  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<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 /*itérateur*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer-it_*/ = ranges::begin(/*base_*/);
        return /*itérateur*/<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>> &&
               /*concatable*/<range_reference_t<const V>, const Pattern>
    {
      return /*itérateur*/<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 /*itérateur*/ < /*simple-view*/<V> &&
               /*simple-view*/ < Pattern >> { *this, ranges::end(/*base_*/) };
      else
        return /*sentinelle*/ < /*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>> &&
               /*concatable*/<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 /*itérateur*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinelle*/<true>{ *this };
    }
  };
  template<class R, class P>
  join_with_view(R&&, P&&) -> join_with_view<views::all_t<R>, views::all_t<P>>;
  template<input_range R>
  join_with_view(R&&, range_value_t<range_reference_t<R>>)
    -> join_with_view<views::all_t<R>, single_view<range_value_t<range_reference_t<R>>>>;
}

Modèle de classe 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> &&
             /*concatable*/<range_reference_t<V>, Pattern>
  template<bool Const>
  class join_with_view<V, Pattern>::/*itérateur*/
  {
    using /*Parent*/      = /*peut-être-const*/<Const, join_with_view>; // exposition uniquement
    using /*Base*/        = /*peut-être-const*/<Const, V>;              // exposition uniquement
    using /*InnerBase*/   = range_reference_t</*Base*/>;            // exposition uniquement
    using /*PatternBase*/ = /*peut-être-const*/<Const, Pattern>;        // exposition uniquement
    using /*OuterIter*/   = iterator_t</*Base*/>;        // exposition uniquement
    using /*InnerIter*/   = iterator_t</*InnerBase*/>;   // exposition uniquement
    using /*PatternIter*/ = iterator_t</*PatternBase*/>; // exposition uniquement
    static constexpr bool /*ref-est-glvalue*/ =
      is_reference_v</*InnerBase*/>; // exposition uniquement
    /*Parent*/* /*parent_*/     = nullptr;                 // exposition uniquement
    /*OuterIter*/ /*outer-it_*/ = /*OuterIter*/();         // exposition-only présent uniquement
                                                           // si Base modélise forward_range
    variant</*PatternIter*/, /*InnerIter*/> /*inner-it_*/; // exposition uniquement
    constexpr /*itérateur*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposition uniquement
    constexpr explicit /*itérateur*/(/*Parent*/& parent)
      requires(!forward_range</*Base*/>);             // exposition uniquement
    constexpr /*OuterIter*/& /*externe*/();             // exposition uniquement
    constexpr const /*OuterIter*/& /*externe*/() const; // exposition uniquement
    constexpr auto& /*mise-à-jour-interne*/();               // exposition uniquement
    constexpr auto& /*get-inner*/();                  // exposition uniquement
    constexpr void /*satisfy*/();                     // exposition uniquement
  public:
    using iterator_concept  = /* voir description */;
    using iterator_category = /* voir description */; // pas toujours présent
    using value_type        = /* voir description */;
    using difference_type   = /* voir description */;
    /*itérateur*/()          = default;
    constexpr /*itérateur*/(/*itérateur*/<!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 /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires /*ref-est-glvalue*/
               && forward_iterator</*OuterIter*/> && forward_iterator</*InnerIter*/>;
    constexpr /*itérateur*/& operator--()
      requires /*ref-est-glvalue*/ && bidirectional_range</*Base*/> &&
               /*bidirectional-common*/</*InnerBase*/> &&
               /*bidirectional-common*/</*PatternBase*/>;
    constexpr /*itérateur*/ operator--(int)
      requires /*ref-est-glvalue*/ && bidirectional_range</*Base*/> &&
               /*bidirectional-common*/</*InnerBase*/> &&
               /*bidirectional-common*/</*PatternBase*/>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*ref-est-glvalue*/
               && forward_range</*Base*/> && equality_comparable</*InnerIter*/>;
    friend constexpr decltype(auto) iter_move(const /*itérateur*/& 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 /*itérateur*/& x, const /*itérateur*/& y)
      requires indirectly_swappable</*InnerIter*/, /*PatternIter*/>
    {
      visit(ranges::iter_swap, x./*inner-it_*/, y./*inner-it_*/);
    }
  };
}

Modèle de classe 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>; // exposition uniquement
    using /*Base*/   = /*maybe-const*/<Const, V>;              // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // exposition uniquement
    constexpr explicit /*sentinel*/(/*Parent*/& parent); // exposition uniquement
  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);
  };
}

Modèle de classe std::ranges::lazy_split_view

namespace std::ranges {
  template<auto>
  struct /*require-constant*/; // exposition uniquement
  template<class R>
  concept /*tiny-range*/ = // exposition uniquement
    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 uniquement
    Pattern /*motif_*/ = Pattern(); // exposition uniquement
    /*cache-non-propagatif*/<iterator_t<V>> /*current_*/; // exposition-only présent uniquement
                                                           // si forward_range<V> est faux
    // modèle de classe lazy_split_view::outer-iterator
    template<bool>
    struct /*itérateur externe*/; // exposition uniquement
    // modèle de classe lazy_split_view::inner-iterator
    template<bool>
    struct /*itérateur-interne*/; // exposition uniquement
  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 /*itérateur externe*/ < /*simple-view*/<V> &&
               /*simple-view*/ < Pattern >> { *this, ranges::begin(/*base_*/) };
      } else {
        /*current_*/ = ranges::begin(/*base_*/);
        return /*itérateur externe*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<V> && forward_range<const V>
    {
      return /*itérateur externe*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
      requires forward_range<V> && common_range<V>
    {
      return /*itérateur externe*/ < /*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 /*itérateur externe*/<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<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>>>;
}

Modèle de classe 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>; // exposition uniquement
    using /*Base*/          = /*maybe-const*/<Const, V>;               // exposition uniquement
    /*Parent*/* /*parent_*/ = nullptr;                                 // exposition uniquement
    iterator_t</*Base*/> /*current_*/ =
      iterator_t</*Base*/>(); // exposition uniquement présent uniquement
                              // si V modélise forward_range
    bool /*trailing-empty_*/ = false; // exposition uniquement
  public:
    using iterator_concept =
      conditional_t<forward_range</*Base*/>, forward_iterator_tag, input_iterator_tag>;
    using iterator_category = input_iterator_tag; // présent uniquement si Base
                                                  // modélise forward_range
    // classe 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);
  };
}

Modèle de classe 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>::/*itérateur-externe*/<Const>::value_type
    : view_interface<value_type>
  {
  private:
    /*itérateur-externe*/ /*i_*/ = /*itérateur-externe*/(); // exposition uniquement
    constexpr explicit value_type(/*itérateur-externe*/ i); // exposition uniquement
  public:
    constexpr /*itérateur-interne*/<Const> begin() const;
    constexpr default_sentinel_t end() const noexcept;
  };
}

Modèle de classe 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>;   // exposition uniquement
    /*outer-iterator*/<Const> /*i_*/ = /*outer-iterator*/<Const>(); // exposition uniquement
    bool /*incremented_*/            = false;                       // exposition uniquement
  public:
    using iterator_concept  = typename /*outer-iterator*/<Const>::iterator_concept;
    using iterator_category = /* voir description */; // présent uniquement si Base
                                                     // modélise forward_range
    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*/>>;
  };
}

Modèle de classe 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();       // exposition uniquement
    Pattern /*pattern_*/ = Pattern(); // exposition uniquement
    // classe split_view::iterator
    struct /*iterator*/; // exposition uniquement
    // classe split_view::sentinel
    struct /*sentinel*/; // exposition uniquement
  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>); // exposition uniquement
  };
  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>>>;
}

Modèle de classe 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;                   // exposition uniquement
    iterator_t<V> /*cur_*/            = iterator_t<V>();           // exposition uniquement
    subrange<iterator_t<V>> /*next_*/ = subrange<iterator_t<V>>(); // exposition uniquement
    bool /*trailing-empty_*/          = false;                     // exposition uniquement
  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);
  };
}

Modèle de classe 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>(); // exposition uniquement
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(split_view& parent);
    friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y);
  };
}

Modèle de classe std::ranges::concat

namespace std::ranges {
  template<class... Rs>
  using /*concat-reference-t*/ =
    common_reference_t<range_reference_t<Rs>...>; // exposition uniquement
  template<class... Rs>
  using /*concat-value-t*/ = common_type_t<range_value_t<Rs>...>; // exposition uniquement
  template<class... Rs>
  using /*concat-rvalue-reference-t*/ = // exposition uniquement
    common_reference_t<range_rvalue_reference_t<Rs>...>;
  template<class... Rs>
  concept /*concat-indirectly-readable*/ = /* voir description */; // exposition uniquement
  template<class... Rs>
  concept /*concatable*/ = /* voir description */; // exposition uniquement
  template<bool Const, class... Rs>
  concept /*concat-is-random-access*/ = /* voir description */; // exposition uniquement
  template<bool Const, class... Rs>
  concept /*concat-is-bidirectional*/ = /* voir description */; // exposition uniquement
  template<input_range... Views>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...>
  class concat_view : public view_interface<concat_view<Views...>>
  {
    tuple<Views...> /*views_*/; // exposition uniquement
    // modèle de classe concat_view::iterator
    template<bool>
    class /*iterator*/; // exposition uniquement
  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>...>;
}

Modèle de classe std::ranges::concat::iterator

namespace std::ranges {
  template<input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...>
  template<bool Const>
  class concat_view<Views...>::/*itérateur*/
  {
  public:
    using iterator_category = /* voir description */; // pas toujours présent
    using iterator_concept  = /* voir description */;
    using value_type        = /*concat-value-t*/</*peut-être-const*/<Const, Views>...>;
    using difference_type =
      common_type_t<range_difference_t</*peut-être-const*/<Const, Views>>...>;
  private:
    using /*base-iter*/ = // exposition uniquement
      variant<iterator_t</*peut-être-const*/<Const, Views>>...>;
    /*peut-être const*/<Const, concat_view>* /*parent_*/ = nullptr; // exposition uniquement
    /*base-iter*/ /*it_*/;                                      // exposition uniquement
    template<size_t N>
    constexpr void /*satisfaire*/(); // exposition uniquement
    template<size_t N>
    constexpr void /*précédent*/(); // exposition uniquement
    template<size_t N>
    constexpr void /*avancer-fwd*/(difference_type offset, // exposition uniquement
                                   difference_type steps);
    template<size_t N>
    constexpr void /*avancer-arrière*/(difference_type offset, // exposition uniquement
                                   difference_type steps);
    template<class... Args>
    constexpr explicit /*itérateur*/(
      /*peut-être-const*/<Const, concat_view>* parent, // exposition uniquement
      Args&&... args)
      requires constructible_from</*base-iter*/, Args&&...>;
  public:
    /*itérateur*/() = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr decltype(auto) operator*() const;
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires /*tout-en-avant*/<Const, Views...>;
    constexpr /*itérateur*/& operator--()
      requires /*concat-is-bidirectional*/<Const, Views...>;
    constexpr /*itérateur*/ operator--(int)
      requires /*concat-is-bidirectional*/<Const, Views...>;
    constexpr /*itérateur*/& operator+=(difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    constexpr /*itérateur*/& 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 /*itérateur*/& x, const /*itérateur*/& y)
      requires(equality_comparable<iterator_t</*peut-être-const*/<Const, Views>>> && ...);
    friend constexpr bool operator==(const /*itérateur*/& it, default_sentinel_t);
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires(/*accès-aléatoire-complet*/<Const, Views...> &&
               (three_way_comparable<iterator_t</*peut-être-const*/<Const, Views>>> && ...));
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& it)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*itérateur*/& x, default_sentinel_t)
      requires /* voir description */;
    friend constexpr difference_type operator-(default_sentinel_t, const /*itérateur*/& x)
      requires /* voir description */;
    friend constexpr decltype(auto) iter_move(const /*itérateur*/& it) noexcept(
      /* voir description */);
    friend constexpr void iter_swap(const /*itérateur*/& x,
                                    const /*itérateur*/& y) noexcept(/* voir description */)
      requires /* voir description */;
  };
}

Modèle de classe 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 uniquement
  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>>;
}

Modèle de classe 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(); // exposition uniquement
  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>>;
}

Modèle de classe 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(); // exposition uniquement
  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>>;
}

Modèle de classe std::ranges::elements_view

namespace std::ranges {
  template<class T, size_t N>
  concept /*has-tuple-element*/ = // exposition uniquement
    /*tuple-like*/<T> && N < tuple_size_v<T>;
  template<class T, size_t N>
  concept /*élément retournable*/ = // exposition uniquement
    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> &&
             /*élément pouvant être retourné*/<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 /*itérateur*/<false>(ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*itérateur*/<true>(ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*vue-simple*/<V> && !common_range<V>)
    {
      return /*sentinelle*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end()
      requires(!/*vue-simple*/<V> && common_range<V>)
    {
      return /*itérateur*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires range<const V>
    {
      return /*sentinelle*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires common_range<const V>
    {
      return /*itérateur*/<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:
    // modèle de classe elements_view::iterator
    template<bool>
    class /*itérateur*/; // exposition uniquement
    // modèle de classe elements_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition uniquement
    V /*base_*/ = V(); // exposition uniquement
  };
}

Modèle de classe 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> &&
             /*élément retournable*/<range_reference_t<V>, N>
  template<bool Const>
  class elements_view<V, N>::/*itérateur*/
  {
    using /*Base*/                    = /*peut-être-const*/<Const, V>; // exposition uniquement
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition uniquement
    static constexpr decltype(auto) /*obtenir-élément*/(
      const iterator_t</*Base*/>& i); // exposition uniquement
  public:
    using iterator_concept  = /* voir description */;
    using iterator_category = /* voir description */; // pas toujours présent
    using value_type        = remove_cvref_t<tuple_element_t<N, range_value_t</*Base*/>>>;
    using difference_type   = range_difference_t</*Base*/>;
    /*itérateur*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr explicit /*itérateur*/(iterator_t</*Base*/> current);
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr iterator_t</*Base*/> base() &&;
    constexpr decltype(auto) operator*() const { return /*obtenir-élément*/(/*current_*/); }
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return /*obtenir-élément*/(/*current_*/ + n);
    }
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Modèle de classe 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>; // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // exposition uniquement
  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);
  };
}

Modèle de classe std::ranges::enumerate_view

namespace std::ranges {
  template<view V>
    requires /*range-avec-références-déplaçables*/<V>
  class enumerate_view : public view_interface<enumerate_view<V>>
  {
    V /*base_*/ = V(); // exposition uniquement
    // modèle de classe enumerate_view::iterator
    template<bool Const>
    class /*itérateur*/; // exposition uniquement
    // modèle de classe enumerate_view::sentinel
    template<bool Const>
    class /*sentinelle*/; // exposition uniquement
  public:
    constexpr enumerate_view()
      requires default_initializable<V>
    = default;
    constexpr explicit enumerate_view(V base);
    constexpr auto begin()
      requires(!/*simple-view*/<V>)
    {
      return /*itérateur*/<false>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto begin() const
      requires /*range-avec-références-déplaçables*/<const V>
    {
      return /*itérateur*/<true>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto end()
      requires(!/*simple-view*/<V>)
    {
      if constexpr (forward_range<V> && common_range<V> && sized_range<V>)
        return /*itérateur*/<false>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*sentinelle*/<false>(ranges::end(/*base_*/));
    }
    constexpr auto end() const
      requires /*range-avec-références-déplaçables*/<const V>
    {
      if constexpr (forward_range<const V> && common_range<const V> &&
                    sized_range<const V>)
        return /*itérateur*/<true>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*sentinelle*/<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>>;
}

Modèle de classe std::ranges::enumerate_view::iterator

namespace std::ranges {
  template<view V>
    requires /*range-avec-références-déplaçables*/<V>
  template<bool Const>
  class enumerate_view<V>::/*itérateur*/
  {
    using /*Base*/ = /*peut-être-const*/<Const, V>; // exposition uniquement
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* voir description */;
    using difference_type   = range_difference_t</*Base*/>;
    using value_type        = tuple<difference_type, range_value_t</*Base*/>>;
  private:
    using /*type-référence*/ = // exposition uniquement
      tuple<difference_type, range_reference_t</*Base*/>>;
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition uniquement
    difference_type /*pos_*/          = 0;                      // exposition uniquement
    constexpr explicit /*itérateur*/(iterator_t</*Base*/> current,
                                    difference_type pos); // exposition uniquement
  public:
    /*itérateur*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr iterator_t</*Base*/> base() &&;
    constexpr difference_type index() const noexcept;
    constexpr auto operator*() const
    {
      return /*type-référence*/(/*pos_*/, */*current_*/);
    }
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return /*reference-type*/(/*pos_*/ + n, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*itérateur*/& x,
                                     const /*itérateur*/& y) noexcept;
    friend constexpr strong_ordering operator<=>(const /*itérateur*/& x,
                                                 const /*itérateur*/& y) noexcept;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y) noexcept;
    friend constexpr auto iter_move(const /*itérateur*/& i) noexcept(
      noexcept(ranges::iter_move(i./*current_*/)) &&
      is_nothrow_move_constructible_v<range_rvalue_reference_t</*Base*/>>)
    {
      return tuple<difference_type, range_rvalue_reference_t</*Base*/>>(
        i./*pos_*/, ranges::iter_move(i./*current_*/));
    }
  };
}

Modèle de classe 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>; // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // exposition uniquement
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // exposition uniquement
  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);
  };
}

Modèle de classe std::ranges::zip_view

namespace std::ranges {
  template<class... Rs>
  concept /*zip-est-commun*/ = // exposition uniquement
    (sizeof...(Rs) == 1 && (common_range<Rs> && ...)) ||
    (!(bidirectional_range<Rs> && ...) && (common_range<Rs> && ...)) ||
    ((random_access_range<Rs> && ...) && (sized_range<Rs> && ...));
  template<input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view : public view_interface<zip_view<Views...>>
  {
    tuple<Views...> /*views_*/; // exposition uniquement
    // modèle de classe zip_view::iterator
    template<bool>
    class /*itérateur*/; // exposition uniquement
    // modèle de classe zip_view::sentinel
    template<bool>
    class /*sentinelle*/; // exposition uniquement
  public:
    zip_view() = default;
    constexpr explicit zip_view(Views... vues);
    constexpr auto begin()
      requires(!(/*vue-simple*/<Views> && ...))
    {
      return /*itérateur*/<false>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto begin() const
      requires(range<const Views> && ...)
    {
      return /*itérateur*/<true>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto end()
      requires(!(/*simple-view*/<Views> && ...))
    {
      if constexpr (!/*zip-est-commun*/<Views...>) {
        return /*sentinelle*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<Views> && ...)) {
        return begin() + iter_difference_t</*itérateur*/<false>>(size());
      } else {
        return /*itérateur*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto end() const
      requires(range<const Views> && ...)
    {
      if constexpr (!/*zip-est-commun*/<const Views...>) {
        return /*sentinelle*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<const Views> && ...)) {
        return begin() + iter_difference_t</*itérateur*/<true>>(size());
      } else {
        return /*itérateur*/<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<Rs>...>;
}

Modèle de classe std::ranges::zip_view::iterator

namespace std::ranges {
  template<input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  template<bool Const>
  class zip_view<Views...>::/*itérateur*/
  {
    tuple<iterator_t</*peut-être-const*/<Const, Views>>...> /*current_*/; // exposition uniquement
    constexpr explicit /*itérateur*/(tuple<iterator_t</*peut-être-const*/<Const, Views>>...>);
    // exposition uniquement
  public:
    using iterator_category = input_iterator_tag; // pas toujours présent
    using iterator_concept  = /* voir description */;
    using value_type        = tuple<range_value_t</*peut-être-const*/<Const, Views>>...>;
    using difference_type =
      common_type_t<range_difference_t</*peut-être-const*/<Const, Views>>...>;
    /*itérateur*/() = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr auto operator*() const;
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires /*tout-en-avant*/<Const, Views...>;
    constexpr /*itérateur*/& operator--()
      requires /*bidirectionnel-tout*/<Const, Views...>;
    constexpr /*itérateur*/ operator--(int)
      requires /*bidirectionnel-tout*/<Const, Views...>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    constexpr auto operator[](difference_type n) const
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires(equality_comparable<iterator_t</*peut-être-const*/<Const, Views>>> && ...);
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& i, difference_type n)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& i)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& i, difference_type n)
      requires /*accès-aléatoire-complet*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires(sized_sentinel_for<iterator_t</*peut-être-const*/<Const, Views>>,
                                  iterator_t</*peut-être-const*/<Const, Views>>> &&
               ...);
    friend constexpr auto iter_move(const /*itérateur*/& i) noexcept(
      /* voir description */);
    friend constexpr void iter_swap(const /*itérateur*/& l,
                                    const /*itérateur*/& r) noexcept(/* voir description */)
      requires(indirectly_swappable<iterator_t</*peut-être-const*/<Const, Views>>> && ...);
  };
}

Modèle de classe 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_*/; // exposition uniquement
    constexpr explicit /*sentinel*/(
      tuple<sentinel_t</*maybe-const*/<Const, Views>>...> end);
    // exposition uniquement
  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);
  };
}

Modèle de classe std::ranges::zip_transform_view

namespace std::ranges {
  template<move_constructible F, input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*peut-être référencé*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view : public view_interface<zip_transform_view<F, Views...>>
  {
    /*boîte mobile*/<F> /*fun_*/; // exposition uniquement
    zip_view<Views...> /*zip_*/; // exposition uniquement
    using /*VueInterne*/ = zip_view<Views...>; // exposition uniquement
    template<bool Const>
    using /*ziperator*/ =
      iterator_t</*peut-être-const*/<Const, /*InnerView*/>>; // exposition uniquement
    template<bool Const>
    using /*zentinel*/ =
      sentinel_t</*peut-être-const*/<Const, /*InnerView*/>>; // exposition uniquement
    // modèle de classe zip_transform_view::iterator
    template<bool>
    class /*itérateur*/; // exposition uniquement
    // modèle de classe zip_transform_view::sentinel
    template<bool>
    class /*sentinelle*/; // exposition uniquement
  public:
    zip_transform_view() = default;
    constexpr explicit zip_transform_view(F fun, Views... views);
    constexpr auto begin() { return /*itérateur*/<false>(*this, /*zip_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      return /*itérateur*/<true>(*this, /*zip_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*InnerView*/>) {
        return /*itérateur*/<false>(*this, /*zip_*/.end());
      } else {
        return /*sentinelle*/<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 /*itérateur*/<true>(*this, /*zip_*/.end());
      } else {
        return /*sentinelle*/<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<Rs>...>;
}

Modèle de classe std::ranges::zip_transform_view::iterator

namespace std::ranges {
  template<move_constructible F, input_range... Vues>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*peut-être référencé*/<invoke_result_t<F&, range_reference_t<Views>...>>
  template<bool Const>
  class zip_transform_view<F, Views...>::/*itérateur*/
  {
    using /*Parent*/ = /*peut-être-const*/<Const, zip_transform_view>; // exposition uniquement
    using /*Base*/   = /*peut-être-const*/<Const, /*InnerView*/>;      // exposition uniquement
    /*Parent*/* /*parent_*/ = nullptr;                             // exposition uniquement
    /*ziperator*/<Const> /*inner_*/;                               // exposition uniquement
    constexpr /*itérateur*/(/*Parent*/& parent,
                           /*ziperator*/<Const> inner); // exposition uniquement
  public:
    using iterator_category = /* voir description */; // pas toujours présent
    using iterator_concept  = typename /*ziperator*/<Const>::iterator_concept;
    using value_type        = remove_cvref_t<
      invoke_result_t</*peut-être-const*/<Const, F>&,
                      range_reference_t</*peut-être-const*/<Const, Views>>...>>;
    using difference_type = range_difference_t</*Base*/>;
    /*itérateur*/()        = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to</*ziperator*/<false>, /*ziperator*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* voir description */);
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires equality_comparable</*ziperator*/<Const>>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for</*ziperator*/<Const>, /*ziperator*/<Const>>;
  };
}

Modèle de classe 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_*/;                             // exposition uniquement
    constexpr explicit /*sentinel*/(/*zentinel*/<Const> inner); // exposition uniquement
  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);
  };
}

Modèle de classe 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(); // exposition uniquement
    // modèle de classe adjacent_view::iterator
    template<bool>
    class /*iterator*/; // exposition uniquement
    // modèle de classe adjacent_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition uniquement
    struct /*as-sentinel*/
    {}; // exposition uniquement
  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>;
  };
}

Modèle de classe 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>::/*itérateur*/
  {
    using /*Base*/ = /*peut-être const*/<Const, V>; // exposition uniquement
    array<iterator_t</*Base*/>, N> /*current_*/ =
      array<iterator_t</*Base*/>, N>(); // exposition uniquement
    constexpr /*itérateur*/(iterator_t</*Base*/> first,
                           sentinel_t</*Base*/> last); // exposition uniquement
    constexpr /*itérateur*/(/*as-sentinel*/,
                           iterator_t</*Base*/> first,
                           iterator_t</*Base*/> last);
    // exposition uniquement
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* voir description */;
    using value_type        = tuple</*RÉPÉTER*/(range_value_t</*Base*/>, N)...>;
    using difference_type   = range_difference_t</*Base*/>;
    /*itérateur*/()          = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr auto operator*() const;
    constexpr /*itérateur*/& operator++();
    constexpr /*itérateur*/ operator++(int);
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Base*/>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y);
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr auto iter_move(const /*itérateur*/& i) noexcept(
      /* voir description */);
    friend constexpr void iter_swap(const /*itérateur*/& l,
                                    const /*itérateur*/& r) noexcept(/* voir description */)
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

Modèle de classe 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>; // exposition uniquement
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // exposition uniquement
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // exposition uniquement
  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);
  };
}

Modèle de classe 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&, /*RÉPÉTER*/(range_reference_t<V>, N)...> &&
             /*peut-être référencé*/<
               invoke_result_t<F&, /*RÉPÉTER*/(range_reference_t<V>, N)...>>
  class adjacent_transform_view : public view_interface<adjacent_transform_view<V, F, N>>
  {
    /*boîte mobile*/<F> /*fun_*/;    // exposition uniquement
    adjacent_view<V, N> /*inner_*/; // exposition uniquement
    using /*InnerView*/ = adjacent_view<V, N>; // exposition uniquement
    template<bool Const>
    using /*itérateur interne*/ =
      iterator_t</*peut-être const*/<Const, /*InnerView*/>>; // exposition uniquement
    template<bool Const>
    using /*inner-sentinel*/ =
      sentinel_t</*peut-être const*/<Const, /*InnerView*/>>; // exposition uniquement
    // class template adjacent_transform_view::iterator
    template<bool>
    class /*itérateur*/; // exposition uniquement
    // modèle de classe adjacent_transform_view::sentinel
    template<bool>
    class /*sentinelle*/; // exposition uniquement
  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 /*itérateur*/<false>(*this, /*inner_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...>
    {
      return /*itérateur*/<true>(*this, /*inner_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*InnerView*/>) {
        return /*itérateur*/<false>(*this, /*inner_*/.end());
      } else {
        return /*sentinelle*/<false>(/*inner_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, /*RÉPÉTER*/(range_reference_t<const V>, N)...>
    {
      if constexpr (common_range<const /*InnerView*/>) {
        return /*itérateur*/<true>(*this, /*inner_*/.end());
      } else {
        return /*sentinelle*/<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();
    }
  };
}

Modèle de classe 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&, /*RÉPÉTER*/(range_reference_t<V>, N)...> &&
             /*peut-être référencé*/<
               invoke_result_t<F&, /*REPÉTER*/(range_reference_t<V>, N)...>>
  template<bool Const>
  class adjacent_transform_view<V, F, N>::/*itérateur*/
  {
    using /*Parent*/ = /*peut-être const*/<Const, adjacent_transform_view>; // exposition uniquement
    using /*Base*/   = /*peut-être const*/<Const, V>;                       // exposition uniquement
    /*Parent*/* /*parent_*/ = nullptr;                                  // exposition uniquement
    /*itérateur interne*/<Const> /*inner_*/;                               // exposition uniquement
    constexpr /*itérateur*/(/*Parent*/& parent,
                           /*itérateur interne*/<Const> inner); // exposition uniquement
  public:
    using iterator_category = /* voir description */;
    using iterator_concept  = typename /*itérateur interne*/<Const>::iterator_concept;
    using value_type =
      remove_cvref_t<invoke_result_t</*peut-être const*/<Const, F>&,
                                     /*RÉPÉTER*/(range_reference_t</*Base*/>, N)...>>;
    using difference_type = range_difference_t</*Base*/>;
    /*itérateur*/()        = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const
               && convertible_to</*itérateur interne*/<false>, /*itérateur interne*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* voir description */);
    constexpr /*itérateur*/& operator++();
    constexpr /*itérateur*/ operator++(int);
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y);
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> &&
               three_way_comparable</*itérateur interne*/<Const>>;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for</*itérateur interne*/<Const>, /*itérateur interne*/<Const>>;
  };
}

Modèle de classe 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_*/;                             // exposition uniquement
    constexpr explicit /*sentinel*/(/*inner-sentinel*/<Const> inner); // exposition uniquement
  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);
  };
}

Modèle de classe std::ranges::chunk_view pour les input_range s

namespace std::ranges {
  template<class I>
  constexpr I /*div-ceil*/(I num, I denom)
  { // exposition uniquement
    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_*/;                              // exposition uniquement
    range_difference_t<V> /*n_*/;             // exposition uniquement
    range_difference_t<V> /*remainder_*/ = 0; // exposition uniquement
    /*non-propagating-cache*/<iterator_t<V>> /*current_*/; // exposition uniquement
    // classe chunk_view::outer-iterator
    class /*outer-iterator*/; // exposition uniquement
    // classe chunk_view::inner-iterator
    class /*inner-iterator*/; // exposition uniquement
  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>>;
}

Modèle de classe std::ranges::chunk_view::outer_iterator pour les input_range s

namespace std::ranges {
  template<view V>
    requires input_range<V>
  class chunk_view<V>::/*outer-iterator*/
  {
    chunk_view* /*parent_*/; // exposition uniquement
    constexpr explicit /*outer-iterator*/(chunk_view& parent); // exposition uniquement
  public:
    using iterator_concept = input_iterator_tag;
    using difference_type  = range_difference_t<V>;
    // classe 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>>;
  };
}

Modèle de classe std::ranges::chunk_view::outer_iterator::value_type pour les 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_*/; // exposition uniquement
    constexpr explicit value_type(chunk_view& parent); // exposition uniquement
  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>>;
  };
}

Modèle de classe std::ranges::chunk_view::inner_iterator pour les input_range s

namespace std::ranges {
  template<view V>
    requires input_range<V>
  class chunk_view<V>::/*inner-iterator*/
  {
    chunk_view* /*parent_*/; // exposition uniquement
    constexpr explicit /*inner-iterator*/(chunk_view& parent) noexcept; // exposition uniquement
  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>>;
  };
}

Modèle de classe std::ranges::chunk_view pour les 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_*/;                  // exposition uniquement
    range_difference_t<V> /*n_*/; // exposition uniquement
    // classe template chunk_view::iterator
    template<bool>
    class /*iterator*/; // exposition uniquement
  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>;
  };
}

Modèle de classe std::ranges::chunk_view::iterator pour les forward_range s

namespace std::ranges {
  template<view V>
    requires forward_range<V>
  template<bool Const>
  class chunk_view<V>::/*itérateur*/
  {
    using /*Parent*/ = /*peut-être const*/<Const, chunk_view>; // exposition uniquement
    using /*Base*/   = /*peut-être const*/<Const, V>;          // exposition uniquement
    iterator_t</*Base*/> /*current_*/         = iterator_t</*Base*/>(); // exposition uniquement
    sentinel_t</*Base*/> /*fin_*/             = sentinel_t</*Base*/>(); // exposition uniquement
    range_difference_t</*Base*/> /*n_*/       = 0;                      // exposition uniquement
    range_difference_t</*Base*/> /*manquant_*/ = 0;                      // exposition uniquement
    constexpr /*itérateur*/(/*Parent*/* parent,
                           iterator_t</*Base*/> current, // exposition uniquement
                           range_difference_t</*Base*/> missing = 0);
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* voir description */;
    using value_type = decltype(views::take(subrange(/*current_*/, /*fin_*/), /*n_*/));
    using difference_type = range_difference_t</*Base*/>;
    /*itérateur*/()        = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr iterator_t</*Base*/> base() const;
    constexpr value_type operator*() const;
    constexpr /*itérateur*/& operator++();
    constexpr /*itérateur*/ operator++(int);
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr value_type operator[](difference_type n) const
      requires random_access_range</*Base*/>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y);
    friend constexpr bool operator==(const /*itérateur*/& x, default_sentinel_t);
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*itérateur*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Modèle de classe std::ranges::slide_view

namespace std::ranges {
  template<class V>
  concept /*slide-caches-nothing*/ =
    random_access_range<V> && sized_range<V>; // exposition uniquement
  template<class V>
  concept /*slide-caches-last*/ = // exposition uniquement
    !/*slide-caches-nothing*/<V> && bidirectional_range<V> && common_range<V>;
  template<class V>
  concept /*slide-caches-first*/ = // exposition uniquement
    !/*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_*/;                  // exposition uniquement
    range_difference_t<V> /*n_*/; // exposition uniquement
    // modèle de classe slide_view::iterator
    template<bool>
    class /*iterator*/; // exposition uniquement
    // classe slide_view::sentinel
    class /*sentinel*/; // exposition uniquement
  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>>;
}

Modèle de classe std::ranges::slide_view::iterator

namespace std::ranges {
  template<forward_range V>
    requires view<V>
  template<bool Const>
  class slide_view<V>::/*itérateur*/
  {
    using /*Base*/                    = /*peut-être const*/<Const, V>; // exposition uniquement
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>();    // exposition uniquement
    iterator_t</*Base*/> /*last-ele_*/ =
      iterator_t</*Base*/>(); // exposition uniquement
                              // présent uniquement si les modèles de base utilisent le cache des diapositives en premier
    range_difference_t</*Base*/> /*n_*/ = 0; // exposition uniquement
    constexpr /*itérateur*/(iterator_t</*Base*/> current,
                           range_difference_t</*Base*/> n) // exposition uniquement
      requires(!/*slide-caches-first*/</*Base*/>);
    constexpr /*itérateur*/(iterator_t</*Base*/> current,
                           iterator_t</*Base*/> last_ele, // exposition uniquement
                           range_difference_t</*Base*/> n)
      requires /*slide-caches-first*/</*Base*/>;
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* voir description */;
    using value_type        = decltype(views::counted(/*current_*/, /*n_*/));
    using difference_type   = range_difference_t</*Base*/>;
    /*itérateur*/()          = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr auto operator*() const;
    constexpr /*itérateur*/& operator++();
    constexpr /*itérateur*/ operator++(int);
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Base*/>;
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y);
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Modèle de classe 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>();           // exposition uniquement
    constexpr explicit /*sentinel*/(sentinel_t<V> end); // exposition uniquement
  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>>;
  };
}

Modèle de classe 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();               // exposition uniquement
    /*movable-box*/<Pred> /*pred_*/; // exposition uniquement
    // classe chunk_by_view::iterator
    class /*iterator*/; // exposition uniquement
  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>); // exposition uniquement
    constexpr iterator_t<V> /*find-prev*/(iterator_t<V>)  // exposition uniquement
      requires bidirectional_range<V>;
  };
  template<class R, class Pred>
  chunk_by_view(R&&, Pred) -> chunk_by_view<views::all_t<R>, Pred>;
}

Modèle de classe 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;         // exposition uniquement
    iterator_t<V> /*current_*/ = iterator_t<V>(); // exposition uniquement
    iterator_t<V> /*next_*/    = iterator_t<V>(); // exposition uniquement
    constexpr /*iterator*/(chunk_by_view& parent,
                           iterator_t<V> current, // exposition uniquement
                           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  = /* voir description */;
    /*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);
  };
}

Modèle de classe 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 uniquement
    range_difference_t<V> /*stride_*/; // exposition uniquement
    // modèle de classe stride_view::iterator
    template<bool>
    class /*itérateur*/; // exposition uniquement
  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(!/*vue-simple*/<V>)
    {
      return /*itérateur*/<false>(this, ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*itérateur*/<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 /*itérateur*/<false>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<V> && !bidirectional_range<V>) {
        return /*itérateur*/<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 /*itérateur*/<true>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<const V> && !bidirectional_range<const V>) {
        return /*itérateur*/<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>>;
}

Modèle de classe std::ranges::stride_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V>
  template<bool Const>
  class stride_view<V>::/*itérateur*/
  {
    using /*Parent*/ = /*peut-être const*/<Const, stride_view>; // exposition uniquement
    using /*Base*/   = /*peut-être const*/<Const, V>;           // exposition uniquement
    iterator_t</*Base*/> /*current_*/         = iterator_t</*Base*/>(); // exposition uniquement
    sentinel_t</*Base*/> /*fin_*/             = sentinel_t</*Base*/>(); // exposition uniquement
    range_difference_t</*Base*/> /*stride_*/  = 0;                      // exposition uniquement
    range_difference_t</*Base*/> /*manquant_*/ = 0;                      // exposition uniquement
    constexpr /*itérateur*/(/*Parent*/* parent,
                           iterator_t</*Base*/> current, // exposition uniquement
                           range_difference_t</*Base*/> missing = 0);
  public:
    using difference_type   = range_difference_t</*Base*/>;
    using value_type        = range_value_t</*Base*/>;
    using iterator_concept  = /* voir description */;
    using iterator_category = /* voir description */; // pas toujours présent
    /*itérateur*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*itérateur*/(/*itérateur*/<!Const> other)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr iterator_t</*Base*/> base() &&;
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr decltype(auto) operator*() const { return */*current_*/; }
    constexpr /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*itérateur*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*itérateur*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*itérateur*/& operator-=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return *(*this + n);
    }
    friend constexpr bool operator==(const /*itérateur*/& x, default_sentinel_t);
    friend constexpr bool operator==(const /*itérateur*/& x, const /*itérateur*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& x, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator+(difference_type n, const /*itérateur*/& x)
      requires random_access_range</*Base*/>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& x, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*itérateur*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr range_rvalue_reference_t</*Base*/> iter_move(
      const /*itérateur*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/)));
    friend constexpr void iter_swap(
      const /*itérateur*/& x,
      const /*itérateur*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/,
                                                                 y./*current_*/)))
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

Modèle de classe std::ranges::cartesian_product_view

namespace std::ranges {
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-random-access*/ = // exposition uniquement
    (random_access_range</*peut-être const*/<Const, First>> && ... &&
     (random_access_range</*peut-être-const*/<Const, Vs>> &&
      sized_range</*peut-être-const*/<Const, Vs>>));
  template<class R>
  concept /*produit-cartésien-argument-commun*/ = // exposition uniquement
    common_range<R> || (sized_range<R> && random_access_range<R>);
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-bidirectional*/ = // exposition uniquement
    (bidirectional_range</*peut-être-const*/<Const, First>> && ... &&
     (bidirectional_range</*peut-être const*/<Const, Vs>> &&
      /*produit-cartésien-argument-commun*/</*peut-être-const*/<Const, Vs>>));
  template<class First, class...>
  concept /*produit-cartésien-est-courant*/ = // exposition uniquement
    /*produit-cartésien-argument-commun*/<First>;
  template<class... Vs>
  concept /*cartesian-product-is-sized*/ = // exposition uniquement
    (sized_range<Vs> && ...);
  template<bool Const, template<class> class FirstSent, class First, class... Vs>
  concept /*cartesian-is-sized-sentinel*/ = // exposition uniquement
    (sized_sentinel_for<FirstSent</*peut-être-const*/<Const, First>>,
                        iterator_t</*peut-être-const*/<Const, First>>> &&
     ... &&
     (sized_range</*peut-être-const*/<Const, Vs>> &&
      sized_sentinel_for<iterator_t</*peut-être-const*/<Const, Vs>>,
                         iterator_t</*peut-être const*/<Const, Vs>>>));
  template</*produit-cartésien-argument-commun*/ R>
  constexpr auto /*cartesian-common-arg-end*/(R& r)
  { // exposition uniquement
    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 uniquement
    // modèle de classe cartesian_product_view::iterator
    template<bool Const>
    class /*itérateur*/; // exposition uniquement
  public:
    constexpr cartesian_product_view() = default;
    constexpr explicit cartesian_product_view(First first_base, Vs... bases);
    constexpr /*itérateur*/<false> begin()
      requires(!/*simple-view*/<First> || ... || !/*vue-simple*/<Vs>);
    constexpr /*itérateur*/<true> begin() const
      requires(range<const First> && ... && range<const Vs>);
    constexpr /*itérateur*/<false> end()
      requires((!/*simple-view*/<First> || ... || !/*simple-view*/<Vs>) &&
               /*produit-cartésien-est-courant*/<First, Vs...>);
    constexpr /*itérateur*/<true> end() const
      requires /*produit-cartésien-est-courant*/<const First, const Vs...>;
    constexpr default_sentinel_t end() const noexcept;
    constexpr /* voir description */ size()
      requires /*produit-cartésien-est-dimensionné*/<First, Vs...>;
    constexpr /* voir description */ size() const
      requires /*produit-cartésien-est-dimensionné*/<const First, const Vs...>;
  };
  template<class... Vs>
  cartesian_product_view(Vs&&...) -> cartesian_product_view<views::all_t<Vs>...>;
}

Modèle de classe 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...>::/*itérateur*/
  {
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* voir description */;
    using value_type        = tuple<range_value_t</*peut-être-const*/<Const, First>>,
                             range_value_t</*peut-être-const*/<Const, Vs>>...>;
    using reference         = tuple<range_reference_t</*peut-être-const*/<Const, First>>,
                            range_reference_t</*peut-être-const*/<Const, Vs>>...>;
    using difference_type   = /* voir description */;
    /*itérateur*/()          = default;
    constexpr /*itérateur*/(/*itérateur*/<!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 /*itérateur*/& operator++();
    constexpr void operator++(int);
    constexpr /*itérateur*/ operator++(int)
      requires forward_range</*peut-être-const*/<Const, First>>;
    constexpr /*itérateur*/& operator--()
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*itérateur*/ operator--(int)
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*itérateur*/& operator+=(difference_type x)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    constexpr /*itérateur*/& 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 /*itérateur*/& x, const /*itérateur*/& y)
      requires equality_comparable<iterator_t</*peut-être-const*/<Const, First>>>;
    friend constexpr bool operator==(const /*itérateur*/& x, default_sentinel_t);
    friend constexpr auto operator<=>(const /*itérateur*/& x, const /*itérateur*/& y)
      requires /*accès-aléatoire-complet*/<Const, First, Vs...>;
    friend constexpr /*itérateur*/ operator+(const /*itérateur*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*itérateur*/ operator+(difference_type x, const /*itérateur*/& y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*itérateur*/ operator-(const /*itérateur*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr difference_type operator-(const /*itérateur*/& x,
                                               const /*itérateur*/& y)
      requires /*cartesian-is-sized-sentinel*/<Const, iterator_t, First, Vs...>;
    friend constexpr difference_type operator-(const /*itérateur*/& i, default_sentinel_t)
      requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr difference_type operator-(default_sentinel_t, const /*itérateur*/& i)
      requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr auto iter_move(const /*itérateur*/& i) noexcept(
      /* voir description */);
    friend constexpr void iter_swap(const /*itérateur*/& l,
                                    const /*itérateur*/& r) noexcept(/* voir description */)
      requires(indirectly_swappable<iterator_t</*peut-être-const*/<Const, First>>> && ... &&
               indirectly_swappable<iterator_t</*peut-être const*/<Const, Vs>>>);
  private:
    using /*Parent*/ = /*peut-être const*/<Const, cartesian_product_view>; // exposition uniquement
    /*Parent*/* /*parent_*/ = nullptr;                                 // exposition uniquement
    tuple<iterator_t</*peut-être-const*/<Const, First>>,
          iterator_t</*peut-être-const*/<Const, Vs>>...>
      /*current_*/; // exposition uniquement
    template<size_t N = sizeof...(Vs)>
    constexpr void /*suivant*/(); // exposition uniquement
    template<size_t N = sizeof...(Vs)>
    constexpr void /*précédent*/(); // exposition uniquement
    template<class Tuple>
    constexpr difference_type /*distance-from*/(const Tuple& t) const; // exposition uniquement
    constexpr /*itérateur*/(
      /*Parent*/& parent,
      tuple<iterator_t</*peut-être const*/<Const, First>>,
            iterator_t</*peut-être const*/<Const, Vs>>...> current); // exposition uniquement
  };
}

Modèle de classe 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(); // exposition uniquement
    using /*cache-t*/ =
      conditional_t<is_reference_v<range_reference_t<V>>, // exposition uniquement
                    add_pointer_t<range_reference_t<V>>,
                    range_reference_t<V>>;
    /*non-propagating-cache*/</*cache-t*/> /*cache_*/; // exposition uniquement
    // classe cache_latest_view::iterator
    class /*iterator*/; // exposition uniquement
    // classe cache_latest_view::sentinel
    class /*sentinel*/; // exposition uniquement
  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>>;
}

Modèle de classe 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_*/; // exposition uniquement
    iterator_t<V> /*current_*/;     // exposition uniquement
    constexpr explicit /*iterator*/(cache_latest_view& parent); // exposition uniquement
  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>>;
  };
}

Modèle de classe 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>(); // exposition uniquement
    constexpr explicit /*sentinel*/(cache_latest_view& parent); // exposition uniquement
  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>>;
  };
}

Modèle de classe 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(); // exposition uniquement
    // classe template to_input_view::iterator
    template<bool Const>
    class /*iterator*/; // exposition uniquement
  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>>;
}

Modèle de classe 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>; // exposition uniquement
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition uniquement
    constexpr explicit /*iterator*/(iterator_t</*Base*/> current); // exposition uniquement
  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*/>>;
  };
}

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 3914 C++23 la contrainte de std::ranges::enumerate_view
était incorrectement spécifiée dans le synopsis
corrigée