Namespaces
Variants

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

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca ranges .

Contenidos

Alias de espacios de nombres

namespace std {

namespace views = ranges :: views ;

}
**Nota:** El código C++ dentro de las etiquetas ` ` no ha sido traducido, como se solicitó. El contenido es código C++ estándar que define un alias de namespace, por lo que no requiere traducción para mantener su funcionalidad técnica.

El alias de espacio de nombres std::views se proporciona como una abreviatura para std::ranges::views .

Includes

(C++20)
Soporte para operador de comparación de tres vías
std::initializer_list plantilla de clase
Iteradores de rango

Conceptos

Conceptos de rango
Definido en el espacio de nombres std::ranges
especifica que un tipo es un rango, es decir, proporciona un begin iterador y un end centinela
(concepto)
especifica que un tipo es un range y los iteradores obtenidos de una expresión del mismo pueden ser devueltos de forma segura sin peligro de referencias colgantes
(concept)
especifica que un rango puede estimar su tamaño en tiempo constante
(concepto)
especifica que un rango conoce su tamaño en tiempo constante
(concept)
especifica que un rango es una vista, es decir, tiene operaciones de copia/movimiento/asignación en tiempo constante
(concepto)
especifica un rango cuyo tipo de iterador satisface input_iterator
(concepto)
especifica un rango cuyo tipo de iterador satisface output_iterator
(concepto)
especifica un rango cuyo tipo de iterador satisface forward_iterator
(concepto)
especifica un rango cuyo tipo de iterador satisface bidirectional_iterator
(concepto)
especifica un rango cuyo tipo de iterador satisface random_access_iterator
(concepto)
especifica un rango cuyo tipo de iterador satisface contiguous_iterator
(concepto)
especifica que un rango tiene tipos de iterador y centinela idénticos
(concepto)
especifica los requisitos para que un range sea convertible de forma segura a una view
(concepto)
especifica que un rango tiene elementos de solo lectura
(concept)

Funciones

Conversiones de rango
Definido en el espacio de nombres std::ranges
(C++23)
construye un nuevo objeto no-vista a partir de un rango de entrada
(plantilla de función)

Clases

Primitivas de rango
Definido en el espacio de nombres std::ranges
obtiene los tipos de iterador y centinela de un rango
(plantilla de alias)
obtiene los tipos de tamaño, diferencia y valor de un rango
(plantilla de alias)
obtiene los tipos de referencia de un rango
(plantilla de alias)
Vistas
Definido en el espacio de nombres std::ranges
clase de plantilla auxiliar para definir una view , utilizando el patrón de plantilla curiosamente recurrente
(plantilla de clase)
combina un par iterador-sentinel en una view
(plantilla de clase)
Manejo de iteradores colgantes
Definido en el espacio de nombres std::ranges
un tipo marcador que indica que un iterador o un subrange no debe ser devuelto ya que quedaría colgante
(clase)
obtiene el tipo de iterador o subrange de un borrowed_range
(plantilla de alias)
Otras utilidades
Definido en el espacio de nombres std::ranges
etiqueta un rango para ser tratado como una secuencia en lugar de un valor único
(plantilla de clase)
Fábricas
Definido en el espacio de nombres std::ranges
una view vacía sin elementos
(plantilla de clase) (plantilla de variable)
una view que contiene un único elemento de un valor especificado
(plantilla de clase) (objeto de punto de personalización)
una view que consiste en una secuencia generada incrementando repetidamente un valor inicial
(plantilla de clase) (objeto de punto de personalización)
una view que consiste en una secuencia generada produciendo repetidamente el mismo valor
(plantilla de clase) (objeto punto de personalización)
una view que consiste en los elementos obtenidos mediante la aplicación sucesiva de operator>> en el flujo de entrada asociado
(plantilla de clase) (objeto de punto de personalización)
Adaptadores
Definido en el espacio de nombres std::ranges
clase de plantilla auxiliar para definir un objeto de cierre de adaptador de rango
(plantilla de clase)
una view que incluye todos los elementos de un range
(alias de plantilla) (objeto adaptador de rango)
una view de los elementos de algún otro range
(plantilla de clase)
una view con propiedad exclusiva de algún range
(plantilla de clase)
una view de una secuencia que convierte cada elemento a un rvalue
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en los elementos de un range que satisface un predicado
(plantilla de clase) (objeto adaptador de rango)
una view de una secuencia que aplica una función de transformación a cada elemento
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en los primeros N elementos de otra view
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en los elementos iniciales de otra view , hasta el primer elemento en el cual un predicado devuelve false
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en elementos de otra view , omitiendo los primeros N elementos
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en los elementos de otra view , omitiendo la subsecuencia inicial de elementos hasta el primer elemento donde el predicado devuelve false
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en la secuencia obtenida al aplanar una view de range s
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en la secuencia obtenida al aplanar una vista de rangos, con el delimitador entre elementos
(plantilla de clase) (objeto adaptador de rango)
una view sobre los subrangos obtenidos al dividir otra view usando un delimitador
(plantilla de clase) (objeto adaptador de rango)
una view sobre los subrangos obtenidos al dividir otra view usando un delimitador
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en la concatenación de las vistas adaptadas
(plantilla de clase) (objeto punto de personalización)
crea un subrango a partir de un iterador y un contador
(objeto de punto de personalización)
convierte una view en un common_range
(plantilla de clase) (objeto adaptador de rango)
una view que itera sobre los elementos de otra vista bidireccional en orden inverso
(plantilla de clase) (objeto adaptador de rango)
convierte una view en un constant_range
(plantilla de clase) (objeto adaptador de rango)
toma una view que consiste en valores tuple-like y un número N, y produce una view del N th elemento de cada tupla
(plantilla de clase) (objeto adaptador de rango)
toma una view que consiste en valores tipo par y produce una view de los primeros elementos de cada par
(plantilla de clase) (objeto adaptador de rango)
toma una view que consiste en valores tipo par y produce una view de los segundos elementos de cada par
(plantilla de clase) (objeto adaptador de rango)
una view que mapea cada elemento de la secuencia adaptada a una tupla que contiene tanto la posición del elemento como su valor
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en tuplas de referencias a elementos correspondientes de las vistas adaptadas
(plantilla de clase) (objeto de punto de personalización)
una view que consiste en los resultados de la aplicación de una función de transformación a los elementos correspondientes de las vistas adaptadas
(plantilla de clase) (objeto punto de personalización)
una view que consiste en tuplas de referencias a elementos adyacentes de la vista adaptada
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en los resultados de aplicar una función de transformación a elementos adyacentes de la vista adaptada
(plantilla de clase) (objeto adaptador de rango)
un rango de view s que son fragmentos sucesivos no superpuestos de tamaño N de los elementos de otra view
(plantilla de clase) (objeto adaptador de rango)
una view cuyo M ésimo elemento es una view sobre los elementos M ésimo a (M + N - 1) ésimo de otra view
(plantilla de clase) (objeto adaptador de rango)
divide el view en subrangos entre cada par de elementos adyacentes para los cuales el predicado dado devuelve false
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en elementos de otra view , avanzando sobre N elementos a la vez
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en tuplas de resultados calculados por el producto cartesiano n-ario de las vistas adaptadas
(plantilla de clase) (objeto de punto de personalización)
una view que almacena en caché el último elemento accedido de su secuencia subyacente
(plantilla de clase) (objeto adaptador de rango)
convierte una view en un rango que es input_range -exclusivo y no common_range
(plantilla de clase) (objeto adaptador de rango)

Objetos de punto de personalización

Acceso a rangos
Definido en el espacio de nombres std::ranges
devuelve un iterador al inicio de un rango
(objeto de punto de personalización)
retorna un centinela que indica el final de un rango
(objeto de punto de personalización)
devuelve un iterador al inicio de un rango de solo lectura
(objeto de punto de personalización)
devuelve un centinela que indica el final de un rango de solo lectura
(objeto de punto de personalización)
devuelve un iterador inverso a un rango
(objeto de punto de personalización)
devuelve un iterador inverso final a un rango
(objeto de punto de personalización)
devuelve un iterador inverso a un rango de solo lectura
(objeto de punto de personalización)
devuelve un iterador inverso final a un rango de solo lectura
(objeto de punto de personalización)
devuelve un entero igual a la sugerencia de reserva proporcionada por un rango
(objeto de punto de personalización)
devuelve un entero igual al tamaño de un rango
(objeto de punto de personalización)
devuelve un entero con signo igual al tamaño de un rango
(objeto de punto de personalización)
comprueba si un rango está vacío
(objeto de punto de personalización)
obtiene un puntero al inicio de un rango contiguo
(objeto de punto de personalización)
obtiene un puntero al inicio de un rango contiguo de solo lectura
(objeto de punto de personalización)

Enumeraciones

Definido en el espacio de nombres std::ranges
especifica si un std::ranges::subrange modela std::ranges::sized_range
(enum)

Ayudantes

obtiene el tamaño de un std::ranges::subrange
(especialización de plantilla de clase)
obtiene el tipo del iterador o el centinela de un std::ranges::subrange
(especialización de plantilla de clase)
obtiene un iterador o centinela de un std::ranges::subrange
(plantilla de función)
etiqueta de construcción from-range
(etiqueta)

Sinopsis

// mayormente independiente
#include <compare>
#include <initializer_list>
#include <iterator>
namespace std::ranges {
  inline namespace /* sin especificar */ {
    // acceso por rango
    inline constexpr /* sin especificar */ begin        = /* sin especificar */;
    inline constexpr /* sin especificar */ end          = /* sin especificar */;
    inline constexpr /* sin especificar */ cbegin       = /* sin especificar */;
    inline constexpr /* sin especificar */ cend         = /* sin especificar */;
    inline constexpr /* sin especificar */ rbegin       = /* sin especificar */;
    inline constexpr /* sin especificar */ rend         = /* sin especificar */;
    inline constexpr /* sin especificar */ crbegin      = /* sin especificar */;
    inline constexpr /* sin especificar */ crend        = /* sin especificar */;
    inline constexpr /* sin especificar */ size         = /* sin especificar */;
    inline constexpr /* sin especificar */ reserve_hint = /* sin especificar */;
    inline constexpr /* sin especificar */ ssize        = /* sin especificar */;
    inline constexpr /* sin especificar */ empty        = /* sin especificar */;
    inline constexpr /* sin especificar */ data         = /* sin especificar */;
    inline constexpr /* sin especificar */ cdata        = /* sin especificar */;
  }
  // rangos
  template<class T>
  concept range = /* ver descripción */;
  template<class T>
  constexpr bool enable_borrowed_range = false;
  template<class T>
  concept borrowed_range = /* ver descripción */;
  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>>;
  // rangos de tamaño
  template<class>
  constexpr bool disable_sized_range = false;
  template<class T>
  concept approximately_sized_range = /* ver descripción */;
  template<class T>
  concept sized_range = /* ver descripción */;
  // vistas
  template<class T>
  constexpr bool enable_view = /* ver descripción */;
  struct view_base
  {};
  template<class T>
  concept view = /* ver descripción */;
  // otros refinamientos de rango
  template<class R, class T>
  concept output_range = /* ver descripción */;
  template<class T>
  concept input_range = /* ver descripción */;
  template<class T>
  concept forward_range = /* ver descripción */;
  template<class T>
  concept bidirectional_range = /* ver descripción */;
  template<class T>
  concept random_access_range = /* ver descripción */;
  template<class T>
  concept contiguous_range = /* ver descripción */;
  template<class T>
  concept common_range = /* ver descripción */;
  template<class T>
  concept viewable_range = /* ver descripción */;
  template<class T>
  concept constant_range = /* ver descripción */;
  // class template view_interface
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class view_interface;
  // sub-ranges
  enum class subrange_kind : bool
  {
    unsized,
    sized
  };
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K =
             /* ver descripción */>
    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 {
  // manejo de iteradores colgantes
  struct dangling;
  // plantilla de clase elements_of
  template<range R, class Allocator = allocator<byte>>
  struct elements_of; // hospedado
  template<range R>
  using borrowed_iterator_t = /* ver descripción */;
  template<range R>
  using borrowed_subrange_t = /* ver descripción */;
  // conversiones de rango
  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);
  // vista vacía
  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{};
  }
  // vista única
  template<move_constructible T>
    requires is_object_v<T>
  class single_view;
  namespace views {
    inline constexpr /* sin especificar */ single = /* sin especificar */;
  }
  template<bool Const, class T>
  using /*quizás-const*/ = conditional_t<Const, const T, T>; // exposición-solamente
  // vista 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 /* sin especificar */ iota = /* sin especificar */;
  }
  // vista repetida
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
    requires /* ver descripción */
  class repeat_view;
  namespace views {
    inline constexpr /* sin especificar */ repeat = /* sin especificar */;
  }
  // vista de istream
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
    requires                /* ver descripción */
  class basic_istream_view; // hospedado
  template<class Val>
  using istream_view = basic_istream_view<Val, char>; // hospedado
  template<class Val>
  using wistream_view = basic_istream_view<Val, wchar_t>; // hospedado
  namespace views {
    template<class T>
    constexpr /* sin especificar */ istream = /* sin especificar */; // hospedado
  }
  // objetos adaptadores de rango
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class range_adaptor_closure
  {};
  // vista completa
  namespace views {
    inline constexpr /* sin especificar */ all = /* sin especificar */;
    template<viewable_range R>
    using all_t = decltype(all(declval<R>()));
  }
  // ref view
  template<range R>
    requires is_object_v<R>
  class ref_view;
  template<class T>
  constexpr bool enable_borrowed_range<ref_view<T>> = true;
  // vista propietaria
  template<range R>
    requires /* ver descripción */
  class owning_view;
  template<class T>
  constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>;
  // como vista de 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 /* sin especificar */ as_rvalue = /* sin especificar */;
  }
  // vista de filtro
  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 /* sin especificar */ filter = /* sin especificar */;
  }
  // transform view
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*puede-referenciar*/<invoke_result_t<F&, range_reference_t<V>>>
  class transform_view;
  namespace views {
    inline constexpr /* sin especificar */ transform = /* sin especificar */;
  }
  // tomar vista
  template<view>
  class take_view;
  template<class T>
  constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* sin especificar */ take = /* sin especificar */;
  }
  // tomar mientras vista
  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 /* sin especificar */ take_while = /* sin especificar */;
  }
  // eliminar vista
  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 /* sin especificar */ drop = /* sin especificar */;
  }
  // vista 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 /* sin especificar */ drop_while = /* sin especificar */;
  }
  // vista de unión
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view;
  namespace views {
    inline constexpr /* sin especificar */ join = /* sin especificar */;
  }
  // unir con vista
  template<input_range V, forward_range Pattern>
    requires /* ver descripción */
  class join_with_view;
  namespace views {
    inline constexpr /* sin especificar */ join_with = /* sin especificar */;
  }
  // vista de división diferida
  template<class R>
  concept /*tiny-range*/ = /* ver descripción */; // exposición-solamente
  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;
  // vista dividida
  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 /* sin especificar */ lazy_split = /* sin especificar */;
    inline constexpr /* sin especificar */ split      = /* sin especificar */;
  }
  // vista de concatenación
  template<input_range... Vistas>
    requires /* ver descripción */
  class concat_view;
  namespace views {
    inline constexpr /* sin especificar */ concat = /* sin especificar */;
  }
  // vista contada
  namespace views {
    inline constexpr /* sin especificar */ counted = /* sin especificar */;
  }
  // vista común
  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 /* sin especificar */ common = /* sin especificar */;
  }
  // vista inversa
  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 /* sin especificar */ reverse = /* sin especificar */;
  }
  // como vista constante
  template<input_range R>
  constexpr auto& /*possibly-const-range*/(R& r) noexcept
  { // exposición-solamente
    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 /* sin especificar */ as_const = /* sin especificar */;
  }
  // vista de elementos
  template<input_range V, size_t N>
    requires /* ver descripción */
  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 /* sin especificar */ elements = /* sin especificar */;
    inline constexpr auto keys           = elements<0>;
    inline constexpr auto values         = elements<1>;
  }
  // enumerar vista
  template<view V>
    requires /* ver descripción */
  class enumerate_view;
  template<class View>
  constexpr bool enable_borrowed_range<enumerate_view<View>> =
    enable_borrowed_range<View>;
  namespace views {
    inline constexpr /* sin especificar */ enumerate = /* sin especificar */;
  }
  // vista zip
  template<input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view;
  template<class... Vistas>
  constexpr bool enable_borrowed_range<zip_view<Views...>> =
    (enable_borrowed_range<Views> && ...);
  namespace views {
    inline constexpr /* sin especificar */ zip = /* sin especificar */;
  }
  // vista de transformación zip
  template<move_constructible F, input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*puede-referenciar*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view;
  namespace views {
    inline constexpr /* sin especificar */ zip_transform = /* sin especificar */;
  }
  // vista adyacente
  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 /* sin especificar */ adjacent = /* sin especificar */;
    inline constexpr auto pairwise       = adjacent<2>;
  }
  // vista de transformación adyacente
  template<forward_range V, move_constructible F, size_t N>
    requires /* ver descripción */
  class adjacent_transform_view;
  namespace views {
    template<size_t N>
    constexpr /* sin especificar */ adjacent_transform = /* sin especificar */;
    inline constexpr auto pairwise_transform       = adjacent_transform<2>;
  }
  // vista de fragmento
  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 /* sin especificar */ chunk = /* sin especificar */;
  }
  // vista de diapositivas
  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 /* sin especificar */ slide = /* sin especificar */;
  }
  // fragmento por vista
  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 /* sin especificar */ chunk_by = /* sin especificar */;
  }
  // vista de stride
  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 /* sin especificar */ stride = /* sin especificar */;
  }
  // vista de producto cartesiano
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  class cartesian_product_view;
  namespace views {
    inline constexpr /* sin especificar */ cartesian_product = /* sin especificar */;
  }
  // almacenar en caché la vista más reciente
  template<input_range V>
    requires view<V>
  class cache_latest_view;
  namespace views {
    inline constexpr /* sin especificar */ cache_latest = /* sin especificar */;
  }
  // a entrada de vista
  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 /* sin especificar */ to_input = /* sin especificar */;
  }
}
namespace std {
  namespace views = ranges::vistas;
  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{};
}

Concepto range

namespace std::ranges {
  template<class T>
  concept range = requires(T& t) {
    ranges::begin(t); // a veces conserva la igualdad (ver descripción)
    ranges::end(t);
  };
}

Concepto borrowed_range

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

Concepto approximately_sized_range

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

Concepto sized_range

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

Concepto view

namespace std::ranges {
  template<class T>
  constexpr bool /*is-derived-from-view-interface*/ =
    /* ver descripción */; // solo para exposición
  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>;
}

Concepto output_range

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

Concepto input_range

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

Concepto forward_range

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

Concepto bidirectional_range

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

Concepto random_access_range

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

Concepto contiguous_range

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

Concepto common_range

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

Concepto viewable_range

namespace std::ranges {
  template<class T>
  concepto 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>))));
}

Concepto constant_range

namespace std::ranges {
  template<class T>
  concepto constant_range = input_range<T> && /*iterador-constante*/<iterator_t<T>>;
}

Conceptos auxiliares

Nota: Los conceptos en esta sección son solo para exposición y no forman parte de la interfaz.

namespace std::ranges { // no especificado, solo para búsqueda de nombres
  template<class R>
  concept /*simple-view*/ = // solo para exposición
    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*/ = // solo para exposición
    input_iterator<I> && (is_pointer_v<I> || requires(const I i) { i.operator->(); });
  template<class T, class U>
  concept /*different-from*/ = // solo para exposición
    !same_as<remove_cvref_t<T>, remove_cvref_t<U>>;
  template<class R>
  concept /*range-with-movable-references*/ = // solo para exposición
    input_range<R> && move_constructible<range_reference_t<R>> &&
    move_constructible<range_rvalue_reference_t<R>>;
  template<class R>
  constexpr bool /*is-initializer-list*/ = /* ver descripción */; // solo para exposición
  template<class T>
  constexpr auto
  /*as-const-pointer*/(const T* p) noexcept
  {
    return p;
  } // solo para exposición
}

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

Plantilla de clase std::ranges::subrange

namespace std::ranges {
  template<class From, class To>
  concept /*uses-nonqualification-pointer-conversion*/ = // exposición-solamente
    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-to-non-slicing*/ = // exposición-solamente
    convertible_to<From, To> &&
    !/*uses-nonqualification-pointer-conversion*/<decay_t<From>, decay_t<To>>;
  template<class T, class U, class V>
  concept /*pair-like-convertible-from*/ = // exposición-solamente
    !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*/ = // exposición-solamente
      K == subrange_kind::sized && !sized_sentinel_for<S, I>;
    I /*begin_*/ = I(); // exposición-solamente
    S /*end_*/   = S(); // exposición-solamente
    /*make-unsigned-like-t*/<iter_difference_t<I>> /*size_*/ =
      0; // exposición-solamente presente únicamente
         // si StoreSize es verdadero
  public:
    subrange()
      requires default_initializable<I>
    = default;
    constexpr subrange(/*convertible-to-non-slicing*/<I> auto i, S s)
      requires(!/*StoreSize*/);
    constexpr subrange(/*convertible-to-non-slicing*/<I> auto i,
                       S s,
                       /*make-unsigned-like-t*/<iter_difference_t<I>> n)
      requires(K == subrange_kind::sized);
    template</*different-from*/<subrange> R>
      requires borrowed_range<R> && /*convertible-to-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</*diferente-de*/<subrange> PairLike>
      requires /*pair-like-convertible-from*/<PairLike, const I&, const S&>
    constexpr operator PairLike() const;
    constexpr I begin() const
      requires copyable<I>;
    constexpr I begin()
      requires(!copyable<I>);
    constexpr S end() const;
    constexpr bool empty() const;
    constexpr /*make-unsigned-like-t*/<iter_difference_t<I>> size() const
      requires(K == subrange_kind::sized);
    constexpr subrange next(iter_difference_t<I> n = 1) const&
      requires forward_iterator<I>;
    constexpr subrange next(iter_difference_t<I> n = 1) &&;
    constexpr subrange prev(iter_difference_t<I> n = 1) const
      requires bidirectional_iterator<I>;
    constexpr subrange& advance(iter_difference_t<I> n);
  };
  template<input_or_output_iterator I, sentinel_for<I> S>
  subrange(I, S) -> subrange<I, S>;
  template<input_or_output_iterator I, sentinel_for<I> S>
  subrange(I, S, /*make-unsigned-like-t*/<iter_difference_t<I>>)
    -> subrange<I, S, subrange_kind::sized>;
  template<borrowed_range R>
  subrange(R&&)
    -> subrange<iterator_t<R>,
                sentinel_t<R>,
                (sized_range<R> || sized_sentinel_for<sentinel_t<R>, iterator_t<R>>)
                  ? subrange_kind::sized
                  : subrange_kind::unsized>;
  template<borrowed_range R>
  subrange(R&&, /*make-unsigned-like-t*/<range_difference_t<R>>)
    -> subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>;
}

Clase std::ranges::dangling

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

Clase 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>;
}

Plantilla de clase 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; }
  };
}

Plantilla de clase 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_*/; // solo para exposición
  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>;
}

Plantilla de clase std::ranges::iota_view

namespace std::ranges {
  template<class I>
  concepto /*decrementable*/ = /* ver descripción */; // solo para exposición
  template<class I>
  concepto /*advanceable*/ = /* ver descripción */; // solo para exposición
  template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t>
    requiere /*weakly-equality-comparable-with*/<W, Bound> && copyable<W>
  class iota_view : public view_interface<iota_view<W, Bound>>
  {
  private:
    // clase iota_view::iterator
    struct /*iterator*/; // solo para exposición
    // clase iota_view::sentinel
    struct /*sentinel*/; // solo para exposición
    W /*value_*/     = W();     // solo para exposición
    Bound /*bound_*/ = Bound(); // solo para exposición
  public:
    iota_view()
      requiere default_initializable<W>
    = default;
    constexpr explicit iota_view(W valor);
    constexpr explicit iota_view(type_identity_t<W> valor, type_identity_t<Bound> límite);
    constexpr explicit iota_view(/*iterator*/ primero, /* ver descripción */ último);
    constexpr /*iterator*/ begin() const;
    constexpr auto end() const;
    constexpr /*iterator*/ end() const
      requiere same_as<W, Bound>;
    constexpr bool empty() const;
    constexpr auto size() const
      requiere /* ver descripción */;
  };
  template<class W, class Bound>
    requiere(!/*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>;
}

Plantilla de clase 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(); // solo para exposición
  public:
    using iterator_concept = /* ver descripción */;
    using iterator_category =
      input_iterator_tag; // presente solo si W modela incrementable y
                          // IOTA-DIFF-T(W) es un tipo integral
    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>;
  };
}

Plantilla de clase 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(); // solo para exposición
  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>;
  };
}

Plantilla de clase std::ranges::repeat_view

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

Plantilla de clase 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*/ = // solo para exposición
      conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>;
    const T* /*value_*/         = nullptr;          // solo para exposición
    /*index-type*/ /*current_*/ = /*index-type*/(); // solo para exposición
    constexpr explicit /*iterator*/(
      const T* value,
      /*index-type*/ b = /*index-type*/()); // solo para exposición
  public:
    using iterator_concept  = random_access_iterator_tag;
    using iterator_category = random_access_iterator_tag;
    using value_type        = T;
    using difference_type   = /* ver descripción */;
    /*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);
  };
}

Plantilla de clase std::ranges::basic_istream_view

namespace std::ranges {
  template<class Val, class CharT, class Traits>
  concept /*stream-extractable*/ = // solo para exposición
    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:
    // clase basic_istream_view::iterator
    struct /*iterator*/;                       // solo para exposición
    basic_istream<CharT, Traits>* /*stream_*/; // solo para exposición
    Val /*value_*/ = Val();                    // solo para exposición
  };
}

Plantilla de clase 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_*/; // solo para exposición
  };
}

Plantilla de clase 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_*/; // solo para exposición
  public:
    template</*different-from*/<ref_view> T>
      requires /* ver descripción */
      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>;
}

Plantilla de clase 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(); // solo para exposición
  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_*/);
    }
  };
}

Plantilla de clase 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(); // solo para exposición
  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>>;
}

Plantilla de clase 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();               // solo para exposición
    /*movable-box*/<Pred> /*pred_*/; // solo para exposición
    // clase filter_view::iterator
    class /*iterator*/; // solo para exposición
    // clase filter_view::sentinel
    class /*sentinel*/; // solo para exposición
  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>;
}

Plantilla de clase 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>(); // solo para exposición
    filter_view* /*parent_*/   = nullptr;         // solo para exposición
  public:
    using iterator_concept  = /* ver descripción */;
    using iterator_category = /* ver descripción */; // no siempre presente
    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>>;
  };
}

Plantilla de clase 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>(); // solo para exposición
  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);
  };
}

Plantilla de clase 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:
    // plantilla de clase transform_view::iterator
    template<bool>
    struct /*iterator*/; // solo exposición
    // plantilla de clase transform_view::sentinel
    template<bool>
    struct /*sentinel*/; // solo exposición
    V /*base_*/ = V();           // solo exposición
    /*movable-box*/<F> /*fun_*/; // solo exposición
  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>;
}

Plantilla de clase 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>> &&
             /*puede-referenciar*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*iterador*/
  {
  private:
    using /*Padre*/ = /*quizás-const*/<Const, transform_view>;  // exposición-solamente
    using /*Base*/   = /*quizás-const*/<Const, V>;               // exposición-solamente
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposición-solamente
    /*Padre*/* /*parent_*/           = nullptr;                // exposición-solamente
  public:
    using iterator_concept  = /* ver descripción */;
    using iterator_category = /* ver descripción */; // no siempre presente
    using value_type        = remove_cvref_t<
      invoke_result_t</*quizás-const*/<Const, F>&, range_reference_t</*Base*/>>>;
    using difference_type = range_difference_t</*Base*/>;
    /*iterador*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*iterador*/(/*Padre*/& parent, iterator_t</*Base*/> current);
    constexpr /*iterador*/(/*iterador*/<!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 /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterador*/ operator+(/*iterador*/ i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, /*iterador*/ i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(/*iterador*/ i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Plantilla de clase std::ranges::transform_view::sentinel

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

Plantilla de clase std::ranges::take_view

namespace std::ranges {
  template<view V>
  class take_view : public view_interface<take_view<V>>
  {
  private:
    V /*base_*/                      = V(); // exposición-solamente
    range_difference_t<V> /*contar_*/ = 0;   // exposición-solamente
    // plantilla de clase take_view::sentinel
    template<bool>
    class /*sentinel*/; // exposición-solamente
  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(!/*vista-simple*/<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(/*contar_*/, ranges::end(/*base_*/) - it);
        return counted_iterator(std::mover(it), sz);
      } else {
        return counted_iterator(ranges::begin(/*base_*/), /*contar_*/);
      }
    }
    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(/*contar_*/, ranges::end(/*base_*/) - it);
        return counted_iterator(std::move(it), sz);
      } else {
        return counted_iterator(ranges::begin(/*base_*/), /*contar_*/);
      }
    }
    constexpr auto end()
      requires(!/*vista-simple*/<V>)
    {
      if constexpr (sized_range<V>) {
        if constexpr (random_access_range<V>)
          return ranges::begin(/*base_*/) + range_difference_t<V>(size());
        else
          return default_sentinel;
      } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) {
        return default_sentinel;
      } else {
        return /*sentinel*/<false>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (sized_range<const V>) {
        if constexpr (random_access_range<const V>)
          return ranges::begin(/*base_*/) + range_difference_t<const V>(size());
        else
          return default_sentinel;
      } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
        return default_sentinel;
      } else {
        return /*sentinel*/<true>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto size()
      requires sized_range<V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*contar_*/));
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*contar_*/));
    }
    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*/(/*contar_*/);
    }
    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, /*contar_*/));
      }
      return /*to-unsigned-like*/(/*contar_*/);
    }
  };
  template<class R>
  take_view(R&&, range_difference_t<R>) -> take_view<views::all_t<R>>;
}

Plantilla de clase 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>; // solo para exposición
    template<bool OtherConst>
    using /*CI*/ =
      counted_iterator<iterator_t</*maybe-const*/<OtherConst, V>>>; // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();         // solo para exposición
  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);
  };
}

Plantilla de clase 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>>
  {
    // plantilla de clase take_while_view::sentinel
    template<bool>
    class /*sentinel*/; // solo para exposición
    V /*base_*/ = V();               // solo para exposición
    /*movable-box*/<Pred> /*pred_*/; // solo para exposición
  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>;
}

Plantilla de clase 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>; // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // solo para exposición
    const Pred* /*pred_*/         = nullptr;                // solo para exposición
  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);
  };
}

Plantilla de clase 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(); // solo para exposición
    range_difference_t<V> /*count_*/ = 0;   // solo para exposición
  };
  template<class R>
  drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;
}
**Notas sobre la traducción:** - Se preservaron todos los tags HTML y atributos - No se tradujo ningún código C++ dentro de las etiquetas `
` y ``
- Se mantuvieron todos los términos específicos de C++ (namespace, template, class, constexpr, etc.)
- Solo se tradujeron los comentarios al español:
  - "exposition-only" → "solo para exposición"
- Se mantuvo el formato y estructura original del código
- Se preservaron todos los enlaces HTML y referencias

Plantilla de clase 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();               // solo para exposición
    /*movable-box*/<Pred> /*pred_*/; // solo para exposición
  };
  template<class R, class Pred>
  drop_while_view(R&&, Pred) -> drop_while_view<views::all_t<R>, Pred>;
}

Plantilla de clase 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>; // exposición-solamente
    // plantilla de clase join_view::iterator
    template<bool Const>
    struct /*iterador*/; // exposición-solamente
    // plantilla de clase join_view::sentinel
    template<bool Const>
    struct /*sentinel*/; // exposición-solamente
    V /*base_*/ = V(); // exposición-solamente
    /*non-propagating-cache*/<iterator_t<V>> /*outer_*/; // exposición-solo presente únicamente
                                                         // cuando !forward_range<V>
    /*non-propagating-cache*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/; // exposición-solo presente únicamente
                  // if is_reference_v<InnerRng> is false
  public:
    join_view()
      requires default_initializable<V>
    = default;
    constexpr explicit join_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        constexpr bool use_const = /*vista-simple*/<V> && is_reference_v</*InnerRng*/>;
        return /*iterador*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer_*/ = ranges::begin(/*base_*/);
        return /*iterador*/<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 /*iterador*/<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 /*iterador*/</*vista-simple*/<V>>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/</*vista-simple*/<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 /*iterador*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/<true>{ *this };
    }
  };
  template<class R>
  explicit join_view(R&&) -> join_view<views::all_t<R>>;
}

Plantilla de clase 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>::/*iterador*/
  {
  private:
    using /*Padre*/    = /*quizás-const*/<Const, join_view>;       // exposición-solamente
    using /*Base*/      = /*quizás-const*/<Const, V>;               // exposición-solamente
    using /*OuterIter*/ = iterator_t</*Base*/>;                    // exposición-solamente
    using /*InnerIter*/ = iterator_t<range_reference_t</*Base*/>>; // exposición-solamente
    static constexpr bool /*ref-es-lvalue*/ = // exposición-solamente
      is_reference_v<range_reference_t</*Base*/>>;
    /*OuterIter*/ /*outer_*/ = /*OuterIter*/(); // exposición-solo presente únicamente
                                                // si Base modela forward_range
    optional</*InnerIter*/> /*inner_*/;         // exposición-solamente
    /*Padre*/* /*parent_*/ = nullptr;          // exposición-solamente
    constexpr void /*satisfy*/(); // exposición-solamente
    constexpr /*OuterIter*/& /*exterior*/();             // exposición-solamente
    constexpr const /*OuterIter*/& /*exterior*/() const; // exposición-solamente
    constexpr /*iterador*/(/*Padre*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposición-solamente
    constexpr explicit /*iterador*/(/*Padre*/& parent)
      requires(!forward_range</*Base*/>); // exposición-solamente
  public:
    using iterator_concept  = /* ver descripción */;
    using iterator_category = /* ver descripción */; // no siempre presente
    using value_type        = range_value_t<range_reference_t</*Base*/>>;
    using difference_type   = /* ver descripción */;
    /*iterador*/()          = default;
    constexpr /*iterador*/(/*iterador*/<!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 /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires /*ref-es-lvalue*/
               && forward_range</*Base*/> && forward_range<range_reference_t</*Base*/>>;
    constexpr /*iterador*/& operator--()
      requires /*ref-es-lvalue*/ && bidirectional_range</*Base*/> &&
               bidirectional_range<range_reference_t</*Base*/>> &&
               common_range<range_reference_t</*Base*/>>;
    constexpr /*iterador*/ operator--(int)
      requires /*ref-es-lvalue*/ && bidirectional_range</*Base*/> &&
               bidirectional_range<range_reference_t</*Base*/>> &&
               common_range<range_reference_t</*Base*/>>;
    friend constexpr bool operator==(const /*iterador*/& x, const /*iterador*/& y)
      requires /*ref-es-lvalue*/ && forward_range</*Base*/> &&
               equality_comparable<iterator_t<range_reference_t</*Base*/>>>;
    friend constexpr decltype(auto) iter_move(const /*iterador*/& i) noexcept(
      noexcept(ranges::iter_move(*i./*inner_*/)))
    {
      return ranges::iter_move(*i./*inner_*/);
    }
    friend constexpr void iter_swap(
      const /*iterador*/& x,
      const /*iterador*/& y) noexcept(noexcept(ranges::iter_swap(*x./*inner_*/,
                                                                 *y./*inner_*/)))
      requires indirectly_swappable</*InnerIter*/>;
  };
}

Plantilla de clase 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>; // solo para exposición
    using /*Base*/                = /*maybe-const*/<Const, V>;         // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();            // solo para exposición
  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);
  };
}

Plantilla de clase std::ranges::join_with_view

namespace std::ranges {
  template<class R>
  concept /*bidireccional-común*/ =
    bidirectional_range<R> && common_range<R>; // exposición-solamente
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>> && view<Pattern> &&
             /*concatenable*/<range_reference_t<V>, Pattern>
  class join_with_view : public view_interface<join_with_view<V, Pattern>>
  {
    using /*InnerRng*/ = range_reference_t<V>; // exposición-solamente
    V /*base_*/        = V();                               // exposición-solamente
    /*non-propagating-cache*/<iterator_t<V>> /*outer-it_*/; // exposición-solo presente
                                                            // solo cuando !forward_range<V>
    /*non-propagating-cache*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/;                     // exposición-solo presente únicamente
                                      // if is_reference_v<InnerRng> is false
    Pattern /*patrón_*/ = Pattern(); // exposición-solamente
    // class template join_with_view::iterator
    template<bool Const>
    struct /*iterador*/; // exposición-solamente
    // class template join_with_view::sentinel
    template<bool Const>
    struct /*sentinel*/; // exposición-solamente
  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::mover(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        constexpr bool use_const =
          /*vista-simple*/<V> && is_reference_v</*InnerRng*/> && /*vista-simple*/<Pattern>;
        return /*iterador*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer-it_*/ = ranges::begin(/*base_*/);
        return /*iterador*/<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>> &&
               /*concatenable*/<range_reference_t<const V>, const Pattern>
    {
      return /*iterador*/<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 /*iterador*/ < /*vista-simple*/<V> &&
               /*vista-simple*/ < Pattern >> { *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/ < /*vista-simple*/<V> &&
               /*vista-simple*/ < 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 /*iterador*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/<true>{ *this };
    }
  };
  template<class R, class P>
  join_with_view(R&&, P&&) -> join_with_view<views::all_t<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>>>>;
}

Plantilla de clase 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>::/*iterador*/
  {
    using /*Padre*/      = /*maybe-const*/<Const, join_with_view>; // exposición-solamente
    using /*Base*/        = /*maybe-const*/<Const, V>;              // exposición-solamente
    using /*InnerBase*/   = range_reference_t</*Base*/>;            // exposición-solamente
    using /*PatternBase*/ = /*maybe-const*/<Const, Pattern>;        // exposición-solamente
    using /*OuterIter*/   = iterator_t</*Base*/>;        // exposición-solamente
    using /*InnerIter*/   = iterator_t</*InnerBase*/>;   // exposición-solamente
    using /*PatternIter*/ = iterator_t</*PatternBase*/>; // exposición-solamente
    static constexpr bool /*ref-es-lvalue*/ =
      is_reference_v</*InnerBase*/>; // exposición-solamente
    /*Padre*/* /*parent_*/     = nullptr;                 // exposición-solamente
    /*OuterIter*/ /*outer-it_*/ = /*OuterIter*/();         // exposición-solo presente únicamente
                                                           // si Base modela forward_range
    variant</*PatternIter*/, /*InnerIter*/> /*inner-it_*/; // exposición-solamente
    constexpr /*iterador*/(/*Padre*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposición-solamente
    constexpr explicit /*iterador*/(/*Padre*/& parent)
      requires(!forward_range</*Base*/>);             // exposición-solamente
    constexpr /*OuterIter*/& /*outer*/();             // exposición-solamente
    constexpr const /*OuterIter*/& /*outer*/() const; // exposición-solamente
    constexpr auto& /*actualizar-interno*/();               // exposición-solamente
    constexpr auto& /*get-inner*/();                  // exposición-solamente
    constexpr void /*satisfy*/();                     // exposición-solamente
  public:
    using iterator_concept  = /* ver descripción */;
    using iterator_category = /* ver descripción */; // no siempre presente
    using value_type        = /* ver descripción */;
    using difference_type   = /* ver descripción */;
    /*iterador*/()          = default;
    constexpr /*iterador*/(/*iterador*/<!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 /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires /*ref-es-lvalue*/
               && forward_iterator</*OuterIter*/> && forward_iterator</*InnerIter*/>;
    constexpr /*iterador*/& operator--()
      requires /*ref-es-lvalue*/ && bidirectional_range</*Base*/> &&
               /*bidireccional-común*/</*InnerBase*/> &&
               /*bidireccional-común*/</*PatternBase*/>;
    constexpr /*iterador*/ operator--(int)
      requires /*ref-es-lvalue*/ && bidirectional_range</*Base*/> &&
               /*bidireccional-común*/</*InnerBase*/> &&
               /*bidireccional-común*/</*PatternBase*/>;
    friend constexpr bool operator==(const /*iterador*/& x, const /*iterador*/& y)
      requires /*ref-es-lvalue*/
               && forward_range</*Base*/> && equality_comparable</*InnerIter*/>;
    friend constexpr decltype(auto) iter_move(const /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y)
      requires indirectly_swappable</*InnerIter*/, /*PatternIter*/>
    {
      visit(ranges::iter_swap
**Nota:** El texto ya está en inglés y contiene términos específicos de C++ (`ranges::iter_swap`) que no deben traducirse según las instrucciones. La estructura HTML se ha preservado intacta sin modificar etiquetas, atributos ni formato., x./*inner-it_*/, y./*inner-it_*/);
    }
  };
}

Plantilla de clase 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>; // solo para exposición
    using /*Base*/   = /*maybe-const*/<Const, V>;              // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // solo para exposición
    constexpr explicit /*sentinel*/(/*Parent*/& parent); // solo para exposición
  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);
  };
}

Plantilla de clase std::ranges::lazy_split_view

namespace std::ranges {
  template<auto>
  struct /*require-constant*/; // exposición-solamente
  template<class R>
  concept /*tiny-range*/ = // exposición-solamente
    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();       // exposición-solamente
    Pattern /*patrón_*/ = Pattern(); // exposición-solamente
    /*non-propagating-cache*/<iterator_t<V>> /*current_*/; // exposición-solo presente únicamente
                                                           // si forward_range<V> es false
    // class template lazy_split_view::outer-iterator
    template<bool>
    struct /*iterador-externo*/; // exposición-solamente
    // plantilla de clase lazy_split_view::inner-iterator
    template<bool>
    struct /*iterador-interno*/; // exposición-solamente
  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::mover(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        return /*iterador-externo*/ < /*vista-simple*/<V> &&
               /*vista-simple*/ < Pattern >> { *this, ranges::begin(/*base_*/) };
      } else {
        /*current_*/ = ranges::begin(/*base_*/);
        return /*iterador-externo*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<V> && forward_range<const V>
    {
      return /*iterador-externo*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
      requires forward_range<V> && common_range<V>
    {
      return /*iterador-externo*/ < /*vista-simple*/<V> &&
             /*vista-simple*/ < Pattern >> { *this, ranges::end(/*base_*/) };
    }
    constexpr auto end() const
    {
      if constexpr (forward_range<V> && forward_range<const V> && common_range<const V>)
        return /*iterador-externo*/<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>>>;
}

Plantilla de clase 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>; // solo para exposición
    using /*Base*/          = /*maybe-const*/<Const, V>;               // solo para exposición
    /*Parent*/* /*parent_*/ = nullptr;                                 // solo para exposición
    iterator_t</*Base*/> /*current_*/ =
      iterator_t</*Base*/>(); // solo para exposición, presente únicamente
                              // si V modela forward_range
    bool /*trailing-empty_*/ = false; // solo para exposición
  public:
    using iterator_concept =
      conditional_t<forward_range</*Base*/>, forward_iterator_tag, input_iterator_tag>;
    using iterator_category = input_iterator_tag; // presente únicamente si Base
                                                  // modela forward_range
    // clase 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);
  };
}

Plantilla de clase std::ranges::lazy_split_view::outer_iterator::value_type

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

Plantilla de clase 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>;   // solo para exposición
    /*outer-iterator*/<Const> /*i_*/ = /*outer-iterator*/<Const>(); // solo para exposición
    bool /*incremented_*/            = false;                       // solo para exposición
  public:
    using iterator_concept  = typename /*outer-iterator*/<Const>::iterator_concept;
    using iterator_category = /* ver descripción */; // presente solo si Base
                                                     // modela 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*/>>;
  };
}

Plantilla de clase 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();       // solo para exposición
    Pattern /*pattern_*/ = Pattern(); // solo para exposición
    // clase split_view::iterator
    struct /*iterator*/; // solo para exposición
    // clase split_view::sentinel
    struct /*sentinel*/; // solo para exposición
  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>); // solo para exposición
  };
  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>>>;
}

Plantilla de clase 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;                   // solo para exposición
    iterator_t<V> /*cur_*/            = iterator_t<V>();           // solo para exposición
    subrange<iterator_t<V>> /*next_*/ = subrange<iterator_t<V>>(); // solo para exposición
    bool /*trailing-empty_*/          = false;                     // solo para exposición
  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);
  };
}

Plantilla de clase 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>(); // solo para exposición
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(split_view& parent);
    friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y);
  };
}

Plantilla de clase std::ranges::concat

namespace std::ranges {
  template<class... Rs>
  using /*concat-reference-t*/ =
    common_reference_t<range_reference_t<Rs>...>; // solo para exposición
  template<class... Rs>
  using /*concat-value-t*/ = common_type_t<range_value_t<Rs>...>; // solo para exposición
  template<class... Rs>
  using /*concat-rvalue-reference-t*/ = // solo para exposición
    common_reference_t<range_rvalue_reference_t<Rs>...>;
  template<class... Rs>
  concept /*concat-indirectly-readable*/ = /* ver descripción */; // solo para exposición
  template<class... Rs>
  concept /*concatable*/ = /* ver descripción */; // solo para exposición
  template<bool Const, class... Rs>
  concept /*concat-is-random-access*/ = /* ver descripción */; // solo para exposición
  template<bool Const, class... Rs>
  concept /*concat-is-bidirectional*/ = /* ver descripción */; // solo para exposición
  template<input_range... Views>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...>
  class concat_view : public view_interface<concat_view<Views...>>
  {
    tuple<Views...> /*views_*/; // solo para exposición
    // plantilla de clase concat_view::iterator
    template<bool>
    class /*iterator*/; // solo para exposición
  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>...>;
}

Plantilla de clase std::ranges::concat::iterator

namespace std::ranges {
  template<input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...>
  template<bool Const>
  class concat_view<Views...>::/*iterador*/
  {
  public:
    using iterator_category = /* ver descripción */; // no siempre presente
    using iterator_concept  = /* ver descripción */;
    using value_type        = /*concat-value-t*/</*maybe-const*/<Const, Views>...>;
    using difference_type =
      common_type_t<range_difference_t</*quizás-const*/<Const, Views>>...>;
  private:
    using /*base-iter*/ = // exposición-solamente
      variant<iterator_t</*maybe-const*/<Const, Views>>...>;
    /*maybe-const*/<Const, concat_view>* /*parent_*/ = nullptr; // exposición-solamente
    /*base-iter*/ /*it_*/;                                      // exposición-solamente
    template<size_t N>
    constexpr void /*satisfy*/(); // exposición-solamente
    template<size_t N>
    constexpr void /*prev*/(); // exposición-solamente
    template<size_t N>
    constexpr void /*avanzar-adelante*/(difference_type offset, // exposición-solamente
                                   difference_type steps);
    template<size_t N>
    constexpr void /*avanzar-atrás*/(difference_type offset, // exposición-solamente
                                   difference_type steps);
    template<class... Args>
    constexpr explicit /*iterador*/(
      /*quizás-const*/<Const, concat_view>* parent, // exposición-solamente
      Args&&... args)
      requires constructible_from</*base-iter*/, Args&&...>;
  public:
    /*iterador*/() = default;
    constexpr /*iterador*/(/*iterador*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr decltype(auto) operator*() const;
    constexpr /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires /*todo-adelante*/<Const, Views...>;
    constexpr /*iterador*/& operator--()
      requires /*concat-es-bidireccional*/<Const, Views...>;
    constexpr /*iterador*/ operator--(int)
      requires /*concat-es-bidireccional*/<Const, Views...>;
    constexpr /*iterador*/& operator+=(difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y)
      requires(equality_comparable<iterator_t</*maybe-const*/<Const, Views>>> && ...);
    friend constexpr bool operator==(const /*iterador*/& it, default_sentinel_t);
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires(/*acceso-aleatorio-total*/<Const, Views...> &&
               (three_way_comparable<iterator_t</*quizás-const*/<Const, Views>>> && ...));
    friend constexpr /*iterador*/ operator+(const /*iterador*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& it)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterador*/& x, default_sentinel_t)
      requires /* ver descripción */;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterador*/& x)
      requires /* ver descripción */;
    friend constexpr decltype(auto) iter_move(const /*iterador*/& it) noexcept(
      /* ver descripción */);
    friend constexpr void iter_swap(const /*iterador*/& x,
                                    const /*iterador*/& y) noexcept(/* ver descripción */)
      requires /* ver descripción */;
  };
}

Plantilla de clase 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(); // exposición-solamente
  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(!/*vista-simple*/<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(!/*vista-simple*/<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>>;
}

Plantilla de clase 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(); // solo para exposición
  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>>;
}

Plantilla de clase 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(); // solo para exposición
  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>>;
}

Plantilla de clase std::ranges::elements_view

namespace std::ranges {
  template<class T, size_t N>
  concept /*has-tuple-element*/ = // exposición-solamente
    /*tuple-like*/<T> && N < tuple_size_v<T>;
  template<class T, size_t N>
  concept /*elemento retornable*/ = // exposición-solamente
    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> &&
             /*elemento retornable*/<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(!/*vista-simple*/<V>)
    {
      return /*iterador*/<false>(ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*iterador*/<true>(ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*vista-simple*/<V> && !common_range<V>)
    {
      return /*sentinel*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end()
      requires(!/*vista-simple*/<V> && common_range<V>)
    {
      return /*iterador*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires range<const V>
    {
      return /*sentinel*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires common_range<const V>
    {
      return /*iterador*/<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:
    // plantilla de clase elements_view::iterator
    template<bool>
    class /*iterador*/; // exposición-solamente
    // plantilla de clase elements_view::sentinel
    template<bool>
    class /*sentinel*/; // exposición-solamente
    V /*base_*/ = V(); // exposición-solamente
  };
}

Plantilla de clase 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> &&
             /*elemento retornable*/<range_reference_t<V>, N>
  template<bool Const>
  class elements_view<V, N>::/*iterador*/
  {
    using /*Base*/                    = /*quizás-const*/<Const, V>; // exposición-solamente
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposición-solamente
    static constexpr decltype(auto) /*obtener-elemento*/(
      const iterator_t</*Base*/>& i); // exposición-solamente
  public:
    using iterator_concept  = /* ver descripción */;
    using iterator_category = /* ver descripción */; // no siempre presente
    using value_type        = remove_cvref_t<tuple_element_t<N, range_value_t</*Base*/>>>;
    using difference_type   = range_difference_t</*Base*/>;
    /*iterador*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr explicit /*iterador*/(iterator_t</*Base*/> current);
    constexpr /*iterador*/(/*iterador*/<!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 /*obtener-elemento*/(/*current_*/); }
    constexpr /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return /*obtener-elemento*/(/*current_*/ + n);
    }
    friend constexpr bool operator==(const /*iterador*/& x, const /*iterador*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Plantilla de clase 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>; // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // solo para exposición
  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);
  };
}

Plantilla de clase std::ranges::enumerate_view

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

Plantilla de clase std::ranges::enumerate_view::iterator

namespace std::ranges {
  template<view V>
    requires /*range-with-movable-references*/<V>
  template<bool Const>
  class enumerate_view<V>::/*iterador*/
  {
    using /*Base*/ = /*quizás-const*/<Const, V>; // exposición-solamente
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* ver descripción */;
    using difference_type   = range_difference_t</*Base*/>;
    using value_type        = tuple<difference_type, range_value_t</*Base*/>>;
  private:
    using /*tipo-referencia*/ = // exposición-solamente
      tuple<difference_type, range_reference_t</*Base*/>>;
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposición-solamente
    difference_type /*pos_*/          = 0;                      // exposición-solamente
    constexpr explicit /*iterador*/(iterator_t</*Base*/> current,
                                    difference_type pos); // exposición-solamente
  public:
    /*iterador*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*iterador*/(/*iterador*/<!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 /*tipo-referencia*/(/*pos_*/, */*current_*/);
    }
    constexpr /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return /*tipo-referencia*/(/*pos_*/ + n, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*iterador*/& x,
                                     const /*iterador*/& y) noexcept;
    friend constexpr strong_ordering operator<=>(const /*iterador*/& x,
                                                 const /*iterador*/& y) noexcept;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y) noexcept;
    friend constexpr auto iter_move(const /*iterador*/& 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./*actual_*/));
    }
  };
}

Plantilla de clase 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>; // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // solo para exposición
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // solo para exposición
  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);
  };
}

Plantilla de clase std::ranges::zip_view

namespace std::ranges {
  template<class... Rs>
  concept /*zip-es-común*/ = // exposición-solamente
    (sizeof...(Rs) == 1 && (common_range<Rs> && ...)) ||
    (!(bidirectional_range<Rs> && ...) && (common_range<Rs> && ...)) ||
    ((random_access_range<Rs> && ...) && (sized_range<Rs> && ...));
  template<input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view : public view_interface<zip_view<Views...>>
  {
    tuple<Views...> /*views_*/; // exposición-solamente
    // class template zip_view::iterator
    template<bool>
    class /*iterador*/; // exposición-solamente
    // class template zip_view::sentinel
    template<bool>
    class /*sentinel*/; // exposición-solamente
  public:
    zip_view() = default;
    constexpr explicit zip_view(Views... views);
    constexpr auto begin()
      requires(!(/*vista-simple*/<Views> && ...))
    {
      return /*iterador*/<false>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto begin() const
      requires(range<const Views> && ...)
    {
      return /*iterador*/<true>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto end()
      requires(!(/*vista-simple*/<Views> && ...))
    {
      if constexpr (!/*zip-es-común*/<Views...>) {
        return /*sentinel*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<Views> && ...)) {
        return begin() + iter_difference_t</*iterador*/<false>>(size());
      } else {
        return /*iterador*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto end() const
      requires(range<const Views> && ...)
    {
      if constexpr (!/*zip-es-común*/<const Views...>) {
        return /*sentinel*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<const Views> && ...)) {
        return begin() + iter_difference_t</*iterador*/<true>>(size());
      } else {
        return /*iterador*/<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>...>;
}

Plantilla de clase std::ranges::zip_view::iterator

namespace std::ranges {
  template<input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  template<bool Const>
  class zip_view<Views...>::/*iterador*/
  {
    tuple<iterator_t</*quizás-const*/<Const, Views>>...> /*current_*/; // exposición-solamente
    constexpr explicit /*iterador*/(tuple<iterator_t</*quizás-const*/<Const, Views>>...>);
    // exposición-solamente
  public:
    using iterator_category = input_iterator_tag; // no siempre presente
    using iterator_concept  = /* ver descripción */;
    using value_type        = tuple<range_value_t</*quizás-const*/<Const, Views>>...>;
    using difference_type =
      common_type_t<range_difference_t</*quizás-const*/<Const, Views>>...>;
    /*iterador*/() = default;
    constexpr /*iterador*/(/*iterador*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr auto operator*() const;
    constexpr /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires /*todo-adelante*/<Const, Views...>;
    constexpr /*iterador*/& operator--()
      requires /*all-bidirectional*/<Const, Views...>;
    constexpr /*iterador*/ operator--(int)
      requires /*all-bidirectional*/<Const, Views...>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    constexpr /*iterador*/& operator-=(difference_type x)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    constexpr auto operator[](difference_type n) const
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator==(const /*iterador*/& x, const /*iterador*/& y)
      requires(equality_comparable<iterator_t</*quizás-const*/<Const, Views>>> && ...);
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& i, difference_type n)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& i)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& i, difference_type n)
      requires /*acceso-aleatorio-total*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires(sized_sentinel_for<iterator_t</*quizás-const*/<Const, Views>>,
                                  iterator_t</*quizás-const*/<Const, Views>>> &&
               ...);
    friend constexpr auto iter_move(const /*iterador*/& i) noexcept(
      /* ver descripción */);
    friend constexpr void iter_swap(const /*iterador*/& l,
                                    const /*iterador*/& r) noexcept(/* ver descripción */)
      requires(indirectly_swappable<iterator_t</*quizás-const*/<Const, Views>>> && ...);
  };
}

Plantilla de clase 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_*/; // solo para exposición
    constexpr explicit /*sentinel*/(
      tuple<sentinel_t</*maybe-const*/<Const, Views>>...> end);
    // solo para exposición
  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);
  };
}

Plantilla de clase std::ranges::zip_transform_view

namespace std::ranges {
  template<move_constructible F, input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*puede-referenciar*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view : public view_interface<zip_transform_view<F, Views...>>
  {
    /*movable-box*/<F> /*fun_*/; // exposición-solamente
    zip_view<Views...> /*zip_*/; // exposición-solamente
    using /*InnerView*/ = zip_view<Views...>; // exposición-solamente
    template<bool Const>
    using /*ziperator*/ =
      iterator_t</*quizás-const*/<Const, /*InnerView*/>>; // exposición-solamente
    template<bool Const>
    using /*zentinel*/ =
      sentinel_t</*quizás-const*/<Const, /*InnerView*/>>; // exposición-solamente
    // plantilla de clase zip_transform_view::iterator
    template<bool>
    class /*iterador*/; // exposición-solamente
    // class template zip_transform_view::sentinel
    template<bool>
    class /*sentinel*/; // exposición-solamente
  public:
    zip_transform_view() = default;
    constexpr explicit zip_transform_view(F fun, Views... views);
    constexpr auto begin() { return /*iterador*/<false>(*this, /*zip_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      return /*iterador*/<true>(*this, /*zip_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*InnerView*/>) {
        return /*iterador*/<false>(*this, /*zip_*/.end());
      } else {
        return /*sentinel*/<false>(/*zip_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      if constexpr (common_range<const /*InnerView*/>) {
        return /*iterador*/<true>(*this, /*zip_*/.end());
      } else {
        return /*sentinel*/<true>(/*zip_*/.end());
      }
    }
    constexpr auto size()
      requires sized_range</*InnerView*/>
    {
      return /*zip_*/.size();
    }
    constexpr auto size() const
      requires sized_range<const /*InnerView*/>
    {
      return /*zip_*/.size();
    }
  };
  template<class F, class... Rs>
  zip_transform_view(F, Rs&&...) -> zip_transform_view<F, views::all_t<Rs>...>;
}

Plantilla de clase std::ranges::zip_transform_view::iterator

namespace std::ranges {
  template<move_constructible F, input_range... Vistas>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*puede-referenciar*/<invoke_result_t<F&, range_reference_t<Views>...>>
  template<bool Const>
  class zip_transform_view<F, Views...>::/*iterador*/
  {
    using /*Padre*/ = /*maybe-const*/<Const, zip_transform_view>; // exposición-solamente
    using /*Base*/   = /*quizás-const*/<Const, /*InnerView*/>;      // exposición-solamente
    /*Padre*/* /*parent_*/ = nullptr;                             // exposición-solamente
    /*ziperator*/<Const> /*inner_*/;                               // exposición-solamente
    constexpr /*iterador*/(/*Padre*/& parent,
                           /*ziperator*/<Const> inner); // exposición-solamente
  public:
    using iterator_category = /* ver descripción */; // no siempre presente
    using iterator_concept  = typename /*ziperator*/<Const>::iterator_concept;
    using value_type        = remove_cvref_t<
      invoke_result_t</*maybe-const*/<Const, F>&,
                      range_reference_t</*quizás-const*/<Const, Views>>...>>;
    using difference_type = range_difference_t</*Base*/>;
    /*iterador*/()        = default;
    constexpr /*iterador*/(/*iterador*/<!Const> i)
      requires Const && convertible_to</*ziperator*/<false>, /*ziperator*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* ver descripción */);
    constexpr /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y)
      requires equality_comparable</*ziperator*/<Const>>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for</*ziperator*/<Const>, /*ziperator*/<Const>>;
  };
}

Plantilla de clase 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_*/;                             // solo exposición
    constexpr explicit /*sentinel*/(/*zentinel*/<Const> inner); // solo exposición
  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);
  };
}

Plantilla de clase 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(); // solo para exposición
    // plantilla de clase adjacent_view::iterator
    template<bool>
    class /*iterator*/; // solo para exposición
    // plantilla de clase adjacent_view::sentinel
    template<bool>
    class /*sentinel*/; // solo para exposición
    struct /*as-sentinel*/
    {}; // solo para exposición
  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>;
  };
}

Plantilla de clase 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>::/*iterador*/
  {
    using /*Base*/ = /*maybe-const*/<Const, V>; // exposición-solamente
    array<iterator_t</*Base*/>, N> /*actual_*/ =
      array<iterator_t</*Base*/>, N>(); // exposición-solamente
    constexpr /*iterador*/(iterator_t</*Base*/> first,
                           sentinel_t</*Base*/> last); // exposición-solamente
    constexpr /*iterador*/(/*as-sentinel*/,
                           iterator_t</*Base*/> first,
                           iterator_t</*Base*/> last);
    // exposición-solamente
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* ver descripción */;
    using value_type        = tuple</*REPEAT*/(range_value_t</*Base*/>, N)...>;
    using difference_type   = range_difference_t</*Base*/>;
    /*iterador*/()          = default;
    constexpr /*iterador*/(/*iterador*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr auto operator*() const;
    constexpr /*iterador*/& operator++();
    constexpr /*iterador*/ operator++(int);
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y);
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr auto iter_move(const /*iterador*/& i) noexcept(
      /* ver descripción */);
    friend constexpr void iter_swap(const /*iterador*/& l,
                                    const /*iterador*/& r) noexcept(/* ver descripción */)
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

Plantilla de clase 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>; // solo para exposición
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // solo para exposición
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // solo para exposición
  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);
  };
}

Plantilla de clase 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&, /*REPEAT*/(range_reference_t<V>, N)...> &&
             /*puede-referenciar*/<
               invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>>
  class adjacent_transform_view : public view_interface<adjacent_transform_view<V, F, N>>
  {
    /*movable-box*/<F> /*fun_*/;    // exposición-solamente
    adjacent_view<V, N> /*inner_*/; // exposición-solamente
    using /*InnerView*/ = adjacent_view<V, N>; // exposición-solamente
    template<bool Const>
    using /*iterador-interno*/ =
      iterator_t</*quizás-const*/<Const, /*InnerView*/>>; // exposición-solamente
    template<bool Const>
    using /*inner-sentinel*/ =
      sentinel_t</*quizás-const*/<Const, /*InnerView*/>>; // exposición-solamente
    // class template adjacent_transform_view::iterator
    template<bool>
    class /*iterador*/; // exposición-solamente
    // plantilla de clase adjacent_transform_view::sentinel
    template<bool>
    class /*sentinel*/; // exposición-solamente
  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::mover(/*inner_*/).base(); }
    constexpr auto begin() { return /*iterador*/<false>(*this, /*inner_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...>
    {
      return /*iterador*/<true>(*this, /*inner_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*InnerView*/>) {
        return /*iterador*/<false>(*this, /*inner_*/.end());
      } else {
        return /*sentinel*/<false>(/*inner_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...>
    {
      if constexpr (common_range<const /*InnerView*/>) {
        return /*iterador*/<true>(*this, /*inner_*/.end());
      } else {
        return /*sentinel*/<true>(/*inner_*/.end());
      }
    }
    constexpr auto size()
      requires sized_range</*InnerView*/>
    {
      return /*inner_*/.size();
    }
    constexpr auto size() const
      requires sized_range<const /*InnerView*/>
    {
      return /*inner_*/.size();
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range</*InnerView*/>
    {
      return /*inner_*/.reserve_hint();
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const /*InnerView*/>
    {
      return /*inner_*/.reserve_hint();
    }
  };
}

Plantilla de clase 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&, /*REPEAT*/(range_reference_t<V>, N)...> &&
             /*puede-referenciar*/<
               invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>>
  template<bool Const>
  class adjacent_transform_view<V, F, N>::/*iterador*/
  {
    using /*Padre*/ = /*quizás-const*/<Const, adjacent_transform_view>; // exposición-solamente
    using /*Base*/   = /*quizás-const*/<Const, V>;                       // exposición-solamente
    /*Padre*/* /*parent_*/ = nullptr;                                  // exposición-solamente
    /*iterador-interno*/<Const> /*inner_*/;                               // exposición-solamente
    constexpr /*iterador*/(/*Padre*/& parent,
                           /*iterador-interno*/<Const> inner); // exposición-solamente
  public:
    using iterator_category = /* ver descripción */;
    using iterator_concept  = typename /*iterador-interno*/<Const>::iterator_concept;
    using value_type =
      remove_cvref_t<invoke_result_t</*quizás-const*/<Const, F>&,
                                     /*REPEAT*/(range_reference_t</*Base*/>, N)...>>;
    using difference_type = range_difference_t</*Base*/>;
    /*iterador*/()        = default;
    constexpr /*iterador*/(/*iterador*/<!Const> i)
      requires Const
               && convertible_to</*iterador-interno*/<false>, /*iterador-interno*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* ver descripción */);
    constexpr /*iterador*/& operator++();
    constexpr /*iterador*/ operator++(int);
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y);
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> &&
               three_way_comparable</*iterador-interno*/<Const>>;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for</*iterador-interno*/<Const>, /*iterador-interno*/<Const>>;
  };
}

Plantilla de clase 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_*/;                             // solo-exposición
    constexpr explicit /*sentinel*/(/*inner-sentinel*/<Const> inner); // solo-exposición
  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);
  };
}

Plantilla de clase std::ranges::chunk_view para input_range s

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

Plantilla de clase std::ranges::chunk_view::outer_iterator para input_range s

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

Plantilla de clase std::ranges::chunk_view::outer_iterator::value_type para 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_*/; // solo para exposición
    constexpr explicit value_type(chunk_view& parent); // solo para exposición
  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>>;
  };
}

Plantilla de clase std::ranges::chunk_view::inner_iterator para input_range s

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

Plantilla de clase std::ranges::chunk_view para 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_*/;                  // solo para exposición
    range_difference_t<V> /*n_*/; // solo para exposición
    // plantilla de clase chunk_view::iterator
    template<bool>
    class /*iterator*/; // solo para exposición
  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>;
  };
}

Plantilla de clase std::ranges::chunk_view::iterator para forward_range s

namespace std::ranges {
  template<view V>
    requires forward_range<V>
  template<bool Const>
  class chunk_view<V>::/*iterador*/
  {
    using /*Padre*/ = /*quizás-const*/<Const, chunk_view>; // exposición-solamente
    using /*Base*/   = /*maybe-const*/<Const, V>;          // exposición-solamente
    iterator_t</*Base*/> /*actual_*/         = iterator_t</*Base*/>(); // exposición-solamente
    sentinel_t</*Base*/> /*end_*/             = sentinel_t</*Base*/>(); // exposición-solamente
    range_difference_t</*Base*/> /*n_*/       = 0;                      // exposición-solamente
    range_difference_t</*Base*/> /*faltante_*/ = 0;                      // exposición-solamente
    constexpr /*iterador*/(/*Padre*/* parent,
                           iterator_t</*Base*/> current, // exposición-solamente
                           range_difference_t</*Base*/> missing = 0);
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* ver descripción */;
    using value_type = decltype(views::take(subrange(/*current_*/, /*end_*/), /*n_*/));
    using difference_type = range_difference_t</*Base*/>;
    /*iterador*/()        = default;
    constexpr /*iterador*/(/*iterador*/<!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 /*iterador*/& operator++();
    constexpr /*iterador*/ operator++(int);
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y);
    friend constexpr bool operator==(const /*iterador*/& x, default_sentinel_t);
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterador*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Plantilla de clase std::ranges::slide_view

namespace std::ranges {
  template<class V>
  concept /*slide-caches-nothing*/ =
    random_access_range<V> && sized_range<V>; // solo para exposición
  template<class V>
  concept /*slide-caches-last*/ = // solo para exposición
    !/*slide-caches-nothing*/<V> && bidirectional_range<V> && common_range<V>;
  template<class V>
  concept /*slide-caches-first*/ = // solo para exposición
    !/*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_*/;                  // solo para exposición
    range_difference_t<V> /*n_*/; // solo para exposición
    // plantilla de clase slide_view::iterator
    template<bool>
    class /*iterator*/; // solo para exposición
    // clase slide_view::sentinel
    class /*sentinel*/; // solo para exposición
  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>>;
}

Plantilla de clase std::ranges::slide_view::iterator

namespace std::ranges {
  template<forward_range V>
    requires view<V>
  template<bool Const>
  class slide_view<V>::/*iterador*/
  {
    using /*Base*/                    = /*quizás-const*/<Const, V>; // exposición-solamente
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>();    // exposición-solamente
    iterator_t</*Base*/> /*last-ele_*/ =
      iterator_t</*Base*/>(); // exposición-solamente
                              // presente solo si los modelos Base utilizan cachés de diapositivas primero
    range_difference_t</*Base*/> /*n_*/ = 0; // exposición-solamente
    constexpr /*iterador*/(iterator_t</*Base*/> current,
                           range_difference_t</*Base*/> n) // exposición-solamente
      requires(!/*slide-caches-first*/</*Base*/>);
    constexpr /*iterador*/(iterator_t</*Base*/> current,
                           iterator_t</*Base*/> last_ele, // exposición-solamente
                           range_difference_t</*Base*/> n)
      requires /*slide-caches-first*/</*Base*/>;
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* ver descripción */;
    using value_type        = decltype(views::counted(/*current_*/, /*n_*/));
    using difference_type   = range_difference_t</*Base*/>;
    /*iterador*/()          = default;
    constexpr /*iterador*/(/*iterador*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr auto operator*() const;
    constexpr /*iterador*/& operator++();
    constexpr /*iterador*/ operator++(int);
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y);
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

Plantilla de clase 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>();           // solo para exposición
    constexpr explicit /*sentinel*/(sentinel_t<V> end); // solo para exposición
  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>>;
  };
}

Plantilla de clase 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();               // solo para exposición
    /*movable-box*/<Pred> /*pred_*/; // solo para exposición
    // clase chunk_by_view::iterator
    class /*iterator*/; // solo para exposición
  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>); // solo para exposición
    constexpr iterator_t<V> /*find-prev*/(iterator_t<V>)  // solo para exposición
      requires bidirectional_range<V>;
  };
  template<class R, class Pred>
  chunk_by_view(R&&, Pred) -> chunk_by_view<views::all_t<R>, Pred>;
}

Plantilla de clase 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;         // solo para exposición
    iterator_t<V> /*current_*/ = iterator_t<V>(); // solo para exposición
    iterator_t<V> /*next_*/    = iterator_t<V>(); // solo para exposición
    constexpr /*iterator*/(chunk_by_view& parent,
                           iterator_t<V> current, // solo para exposición
                           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  = /* ver descripción */;
    /*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);
  };
}

Plantilla de clase 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_*/;                       // exposición-solamente
    range_difference_t<V> /*stride_*/; // exposición-solamente
    // plantilla de clase stride_view::iterator
    template<bool>
    class /*iterador*/; // exposición-solamente
  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::mover(/*base_*/); }
    constexpr range_difference_t<V> stride() const noexcept;
    constexpr auto begin()
      requires(!/*vista-simple*/<V>)
    {
      return /*iterador*/<false>(this, ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*iterador*/<true>(this, ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*vista-simple*/<V>)
    {
      if constexpr (common_range<V> && sized_range<V> && forward_range<V>) {
        auto missing =
          (/*stride_*/ - ranges::distance(/*base_*/) % /*stride_*/) % /*stride_*/;
        return /*iterador*/<false>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<V> && !bidirectional_range<V>) {
        return /*iterador*/<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 /*iterador*/<true>(this, ranges::end(/*base_*/), missing);
      } else if constexpr (common_range<const V> && !bidirectional_range<const V>) {
        return /*iterador*/<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>>;
}

Plantilla de clase std::ranges::stride_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V>
  template<bool Const>
  class stride_view<V>::/*iterador*/
  {
    using /*Padre*/ = /*maybe-const*/<Const, stride_view>; // exposición-solamente
    using /*Base*/   = /*quizás-const*/<Const, V>;           // exposición-solamente
    iterator_t</*Base*/> /*current_*/         = iterator_t</*Base*/>(); // exposición-solamente
    sentinel_t</*Base*/> /*end_*/             = sentinel_t</*Base*/>(); // exposición-solamente
    range_difference_t</*Base*/> /*stride_*/  = 0;                      // exposición-solamente
    range_difference_t</*Base*/> /*faltante_*/ = 0;                      // exposición-solamente
    constexpr /*iterador*/(/*Padre*/* parent,
                           iterator_t</*Base*/> current, // exposición-solamente
                           range_difference_t</*Base*/> missing = 0);
  public:
    using difference_type   = range_difference_t</*Base*/>;
    using value_type        = range_value_t</*Base*/>;
    using iterator_concept  = /* ver descripción */;
    using iterator_category = /* ver descripción */; // no siempre presente
    /*iterador*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*iterador*/(/*iterador*/<!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 */*actual_*/; }
    constexpr /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterador*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterador*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*iterador*/& 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 /*iterador*/& x, default_sentinel_t);
    friend constexpr bool operator==(const /*iterador*/& x, const /*iterador*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& x, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator+(difference_type n, const /*iterador*/& x)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& x, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterador*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*iterador*/& 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 /*iterador*/& i) noexcept(noexcept(ranges::iter_move(i./*actual_*/)));
    friend constexpr void iter_swap(
      const /*iterador*/& x,
      const /*iterador*/& y) noexcept(noexcept(ranges::iter_swap
(No hay texto para traducir fuera de las etiquetas HTML y términos de C++ que deben conservarse según las instrucciones)(x./*current_*/,
                                                                 y./*actual_*/)))
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

Plantilla de clase std::ranges::cartesian_product_view

namespace std::ranges {
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-random-access*/ = // exposición-solamente
    (random_access_range</*maybe-const*/<Const, First>> && ... &&
     (random_access_range</*maybe-const*/<Const, Vs>> &&
      sized_range</*maybe-const*/<Const, Vs>>));
  template<class R>
  concept /*producto-cartesiano-argumento-común*/ = // exposición-solamente
    common_range<R> || (sized_range<R> && random_access_range<R>);
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-bidirectional*/ = // exposición-solamente
    (bidirectional_range</*quizás-const*/<Const, First>> && ... &&
     (bidirectional_range</*maybe-const*/<Const, Vs>> &&
      /*producto-cartesiano-argumento-común*/</*maybe-const*/<Const, Vs>>));
  template<class First, class...>
  concept /*producto-cartesiano-es-común*/ = // exposición-solamente
    /*producto-cartesiano-argumento-común*/<First>;
  template<class... Vs>
  concept /*producto-cartesiano-tiene-tamaño*/ = // exposición-solamente
    (sized_range<Vs> && ...);
  template<bool Const, template<class> class FirstSent, class First, class... Vs>
  concept /*cartesian-is-sized-sentinel*/ = // exposición-solamente
    (sized_sentinel_for<FirstSent</*quizás-const*/<Const, First>>,
                        iterator_t</*quizás-const*/<Const, First>>> &&
     ... &&
     (sized_range</*maybe-const*/<Const, Vs>> &&
      sized_sentinel_for<iterator_t</*maybe-const*/<Const, Vs>>,
                         iterator_t</*maybe-const*/<Const, Vs>>>));
  template</*producto-cartesiano-argumento-común*/ R>
  constexpr auto /*cartesian-common-arg-end*/(R& r)
  { // exposición-solamente
    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_*/; // exposición-solamente
    // class template cartesian_product_view::iterator
    template<bool Const>
    class /*iterador*/; // exposición-solamente
  public:
    constexpr cartesian_product_view() = default;
    constexpr explicit cartesian_product_view(First first_base, Vs... bases);
    constexpr /*iterador*/<false> begin()
      requires(!/*vista-simple*/<First> || ... || !/*vista-simple*/<Vs>);
    constexpr /*iterador*/<true> begin() const
      requires(range<const First> && ... && range<const Vs>);
    constexpr /*iterator*/<false> end()
      requires((!/*vista-simple*/<First> || ... || !/*vista-simple*/<Vs>) &&
               /*producto-cartesiano-es-común*/<First, Vs...>);
    constexpr /*iterador*/<true> end() const
      requires /*producto-cartesiano-es-común*/<const First, const Vs...>;
    constexpr default_sentinel_t end() const noexcept;
    constexpr /* ver descripción */ size()
      requires /*cartesian-product-is-sized*/<First, Vs...>;
    constexpr /* ver descripción */ size() const
      requires /*cartesian-product-is-sized*/<const First, const Vs...>;
  };
  template<class... Vs>
  cartesian_product_view(Vs&&...) -> cartesian_product_view<views::all_t<Vs>...>;
}

Plantilla de clase 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...>::/*iterador*/
  {
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* ver descripción */;
    using value_type        = tuple<range_value_t</*maybe-const*/<Const, First>>,
                             range_value_t</*maybe-const*/<Const, Vs>>...>;
    using reference         = tuple<range_reference_t</*maybe-const*/<Const, First>>,
                            range_reference_t</*quizás-const*/<Const, Vs>>...>;
    using difference_type   = /* ver descripción */;
    /*iterador*/()          = default;
    constexpr /*iterador*/(/*iterador*/<!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 /*iterador*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterador*/ operator++(int)
      requires forward_range</*maybe-const*/<Const, First>>;
    constexpr /*iterador*/& operator--()
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*iterador*/ operator--(int)
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*iterador*/& operator+=(difference_type x)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    constexpr /*iterador*/& 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 /*iterador*/& x, const /*iterador*/& y)
      requires equality_comparable<iterator_t</*maybe-const*/<Const, First>>>;
    friend constexpr bool operator==(const /*iterador*/& x, default_sentinel_t);
    friend constexpr auto operator<=>(const /*iterador*/& x, const /*iterador*/& y)
      requires /*acceso-aleatorio-total*/<Const, First, Vs...>;
    friend constexpr /*iterador*/ operator+(const /*iterador*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterador*/ operator+(difference_type x, const /*iterador*/& y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterador*/ operator-(const /*iterador*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterador*/& x,
                                               const /*iterador*/& y)
      requires /*cartesian-is-sized-sentinel*/<Const, iterator_t, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterador*/& i, default_sentinel_t)
      requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterador*/& i)
      requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr auto iter_move(const /*iterador*/& i) noexcept(
      /* ver descripción */);
    friend constexpr void iter_swap(const /*iterador*/& l,
                                    const /*iterador*/& r) noexcept(/* ver descripción */)
      requires(indirectly_swappable<iterator_t</*maybe-const*/<Const, First>>> && ... &&
               indirectly_swappable<iterator_t</*maybe-const*/<Const, Vs>>>);
  private:
    using /*Padre*/ = /*maybe-const*/<Const, cartesian_product_view>; // exposición-solamente
    /*Padre*/* /*parent_*/ = nullptr;                                 // exposición-solamente
    tuple<iterator_t</*maybe-const*/<Const, First>>,
          iterator_t</*maybe-const*/<Const, Vs>>...>
      /*current_*/; // exposición-solamente
    template<size_t N = sizeof...(Vs)>
    constexpr void /*siguiente*/(); // exposición-solamente
    template<size_t N = sizeof...(Vs)>
    constexpr void /*prev*/(); // exposición-solamente
    template<class Tuple>
    constexpr difference_type /*distancia-desde*/(const Tuple& t) const; // exposición-solamente
    constexpr /*iterador*/(
      /*Padre*/& parent,
      tuple<iterator_t</*maybe-const*/<Const, First>>,
            iterator_t</*maybe-const*/<Const, Vs>>...> current); // exposición-solamente
  };
}

Plantilla de clase 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(); // solo para exposición
    using /*cache-t*/ =
      conditional_t<is_reference_v<range_reference_t<V>>, // solo para exposición
                    add_pointer_t<range_reference_t<V>>,
                    range_reference_t<V>>;
    /*non-propagating-cache*/</*cache-t*/> /*cache_*/; // solo para exposición
    // clase cache_latest_view::iterator
    class /*iterator*/; // solo para exposición
    // clase cache_latest_view::sentinel
    class /*sentinel*/; // solo para exposición
  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>>;
}

Plantilla de clase 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_*/; // solo para exposición
    iterator_t<V> /*current_*/;     // solo para exposición
    constexpr explicit /*iterator*/(cache_latest_view& parent); // solo para exposición
  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>>;
  };
}

Plantilla de clase 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>(); // solo para exposición
    constexpr explicit /*sentinel*/(cache_latest_view& parent); // solo para exposición
  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>>;
  };
}

Plantilla de clase 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(); // solo para exposición
    // plantilla de clase to_input_view::iterator
    template<bool Const>
    class /*iterator*/; // solo para exposición
  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>>;
}

Plantilla de clase 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>; // solo para exposición
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // solo para exposición
    constexpr explicit /*iterator*/(iterator_t</*Base*/> current); // solo para exposición
  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*/>>;
  };
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3914 C++23 la restricción de std::ranges::enumerate_view
estaba incorrectamente especificada en la sinopsis
corregido