Namespaces
Variants

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

From cppreference.net
Standard library headers

此头文件是 ranges 库的组成部分。

目录

命名空间别名

namespace std {

namespace views = ranges :: views ;

}

命名空间别名 std::views 作为 std::ranges::views 的简写形式提供。

包含头文件

(C++20)
三路比较运算符 支持
std::initializer_list 类模板
范围迭代器

Concepts

区间概念
定义于 命名空间 std::ranges
指定类型为范围,即提供 begin 迭代器和 end 哨位
(概念)
指定类型为 range 且从其表达式获取的迭代器可安全返回而不会产生悬垂风险
(概念)
指定范围能在常数时间内估算其大小
(concept)
指定范围能在常数时间内获知其大小
(概念)
指定一个范围是视图,即具有常数时间复制/移动/赋值操作
(concept)
指定其迭代器类型满足 input_iterator 要求的范围
(概念)
指定其迭代器类型满足 output_iterator 要求的范围
(概念)
指定其迭代器类型满足 forward_iterator 要求的范围
(概念)
指定其迭代器类型满足 bidirectional_iterator 要求的范围
(概念)
指定其迭代器类型满足 random_access_iterator 要求的范围
(概念)
指定其迭代器类型满足 contiguous_iterator 的区间要求
(概念)
指定一个范围拥有相同的迭代器和哨兵类型
(concept)
规定 range 可安全转换为 view 的要求条件
(概念)
指定一个范围具有只读元素
(概念)

函数

范围转换
定义于 命名空间 std::ranges
(C++23)
从输入范围构造新的非视图对象
(函数模板)

区间原语
定义于 命名空间 std::ranges
获取范围的迭代器和哨兵类型
(别名模板)
获取范围的大小、差值和值类型
(别名模板)
获取范围的引用类型
(别名模板)
视图
定义于 命名空间 std::ranges
用于定义 view 的辅助类模板,采用 奇异递归模板模式
(类模板)
将迭代器-哨位对组合为一个 view
(类模板)
悬空迭代器处理
定义于 命名空间 std::ranges
用于指示迭代器或 subrange 不应被返回的占位符类型,因为返回会导致悬垂引用
(类)
获取 borrowed_range 的迭代器类型或 subrange 类型
(别名模板)
其他工具
定义于 命名空间 std::ranges
标记一个范围,将其视为序列而非单个值
(类模板)
工厂模式
定义于 命名空间 std::ranges
一个不包含任何元素的空 view
(类模板) (变量模板)
包含指定单一元素的 view
(类模板) (定制点对象)
一个由重复递增初始值生成的序列组成的 view
(类模板) (定制点对象)
一个 view 通过重复生成相同值构成的序列
(类模板) (定制点对象)
通过连续对关联输入流应用 operator>> 操作所获取元素构成的 view
(类模板) (定制点对象)
适配器
定义于 命名空间 std::ranges
用于定义范围适配器闭包对象的辅助基类模板
(类模板)
包含 range 所有元素的 view
(别名模板) (范围适配器对象)
某个其他 range 元素的 view
(类模板)
一个 view ,唯一拥有某个 range
(类模板)
将序列中每个元素转换为右值的 view
(类模板) (范围适配器对象)
一个由满足谓词条件的 range 元素组成的 view
(类模板) (范围适配器对象)
一个对序列中每个元素应用转换函数的 view
(类模板) (范围适配器对象)
一个由另一个 view 的前N个元素组成的 view
(类模板) (范围适配器对象)
一个由另一个 view 的初始元素组成的 view ,直到首个谓词返回 false 的元素为止
(类模板) (范围适配器对象)
一个由另一个 view 的元素组成的 view ,跳过前N个元素
(类模板) (范围适配器对象)
一个由另一个 view 的元素组成的 view ,跳过初始元素子序列直到首个谓词返回 false 的元素
(类模板) (范围适配器对象)
一个由展平 view range 序列 所组成的 view
(类模板) (范围适配器对象)
一个由展平范围视图序列组成的 view ,元素间包含分隔符
(类模板) (范围适配器对象)
通过使用分隔符拆分另一个 view 所获得的子范围构成的 view
(类模板) (范围适配器对象)
一个 view ,通过使用分隔符拆分另一个 view 获得的子范围构成
(类模板) (范围适配器对象)
由被适配视图的串联组成的 view
(类模板) (定制点对象)
根据迭代器和计数创建子范围
(定制点对象)
view 转换为 common_range
(类模板) (范围适配器对象)
一个 view ,以逆序迭代另一个双向视图的元素
(类模板) (范围适配器对象)
view 转换为 constant_range
(类模板) (范围适配器对象)
获取由 view 组成的 tuple-like 值和一个数字 N,生成每个元组第 N th 个元素的 view
(类模板) (范围适配器对象)
获取由键值对组成的 view ,并生成每个键值对中第一个元素的 view
(类模板) (范围适配器对象)
获取由键值对组成的 view 并生成每个键值对中第二个元素的 view
(类模板) (范围适配器对象)
一个 view 将适配序列的每个元素映射为包含元素位置及其值的元组
(类模板) (范围适配器对象)
一个由被适配视图的对应元素引用组成的元组 view
(类模板) (定制点对象)
一个由应用转换函数到被适配视图的对应元素所生成结果组成的 view
(类模板) (定制点对象)
由被适配视图的相邻元素引用组成的元组构成的 view
(类模板) (范围适配器对象)
一个由对适配视图的相邻元素应用转换函数的结果组成的 view
(类模板) (范围适配器对象)
由另一个 view 的元素组成的 N 大小非重叠连续区块的 view 范围
(类模板) (范围适配器对象)
一个 view ,其第 M th 个元素是另一个 view 中第 M th 至第 (M + N - 1) th 个元素的 view
(类模板) (范围适配器对象)
view 分割为子范围,分割位置位于每一对相邻元素之间,当给定谓词返回 false
(类模板) (范围适配器对象)
一个由另一个 view 的元素组成的 view ,每次跨越 N 个元素前进
(类模板) (范围适配器对象)
由被适配视图的n元笛卡尔积计算结果元组组成的 view
(类模板) (定制点对象)
一个 view 用于缓存其底层序列最后被访问的元素
(类模板) (范围适配器对象)
view 转换为仅支持 input_range 且非 common_range 的范围
(类模板) (范围适配器对象)

定制点对象

范围访问
定义于 命名空间 std::ranges
返回指向范围起始位置的迭代器
(定制点对象)
返回指示范围末尾的哨兵
(定制点对象)
返回指向只读范围起始的迭代器
(定制点对象)
返回指示只读范围末尾的哨兵
(定制点对象)
返回指向范围的反向迭代器
(定制点对象)
返回指向范围的反向末端迭代器
(定制点对象)
返回指向只读范围的反向迭代器
(定制点对象)
返回指向只读范围的反向末端迭代器
(定制点对象)
返回等于范围给出的预留提示的整数值
(定制点对象)
返回等于范围大小的整数值
(定制点对象)
返回等于范围大小的有符号整数
(定制点对象)
检查范围是否为空
(定制点对象)
获取指向连续范围起始位置的指针
(定制点对象)
获取指向只读连续范围起始位置的指针
(定制点对象)

枚举类型

定义于 命名空间 std::ranges
指定一个 std::ranges::subrange 是否满足 std::ranges::sized_range 概念
(枚举)

辅助函数

获取 std::ranges::subrange 的大小
(类模板特化)
获取 std::ranges::subrange 的迭代器或哨兵类型
(类模板特化)
std::ranges::subrange 获取迭代器或哨位
(函数模板)
从范围构造标签
(标签)

概要

// mostly freestanding
#include <compare>
#include <initializer_list>
#include <iterator>
namespace std::ranges {
  inline namespace /* 未指定 */ {
    // 范围访问
    inline constexpr /* 未指定 */ begin        = /* 未指定 */;
    inline constexpr /* 未指定 */ end          = /* 未指定 */;
    inline constexpr /* 未指定 */ cbegin       = /* 未指定 */;
    inline constexpr /* 未指定 */ cend         = /* 未指定 */;
    inline constexpr /* 未指定 */ rbegin       = /* 未指定 */;
    inline constexpr /* 未指定 */ rend         = /* 未指定 */;
    inline constexpr /* 未指定 */ crbegin      = /* 未指定 */;
    inline constexpr /* 未指定 */ crend        = /* 未指定 */;
    inline constexpr /* 未指定 */ size         = /* 未指定 */;
    inline constexpr /* 未指定 */ reserve_hint = /* 未指定 */;
    inline constexpr /* 未指定 */ ssize        = /* 未指定 */;
    inline constexpr /* 未指定 */ empty        = /* 未指定 */;
    inline constexpr /* 未指定 */ data         = /* 未指定 */;
    inline constexpr /* 未指定 */ cdata        = /* 未指定 */;
  }
  // 范围
  template<class T>
  concept range = /* 查看描述 */;
  template<class T>
  constexpr bool enable_borrowed_range = false;
  template<class T>
  concept borrowed_range = /* 查看描述 */;
  template<class T>
  using iterator_t = decltype(ranges::begin(declval<T&>()));
  template<range R>
  using sentinel_t = decltype(ranges::end(declval<R&>()));
  template<range R>
  using const_iterator_t = decltype(ranges::cbegin(declval<R&>()));
  template<range R>
  using const_sentinel_t = decltype(ranges::cend(declval<R&>()));
  template<range R>
  using range_difference_t = iter_difference_t<iterator_t<R>>;
  template<sized_range R>
  using range_size_t = decltype(ranges::size(declval<R&>()));
  template<range R>
  using range_value_t = iter_value_t<iterator_t<R>>;
  template<range R>
  using range_reference_t = iter_reference_t<iterator_t<R>>;
  template<range R>
  using range_const_reference_t = iter_const_reference_t<iterator_t<R>>;
  template<range R>
  using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>;
  template<range R>
  using range_common_reference_t = iter_common_reference_t<iterator_t<R>>;
  // sized ranges
  template<class>
  constexpr bool disable_sized_range = false;
  template<class T>
  concept approximately_sized_range = /* 查看描述 */;
  template<class T>
  concept sized_range = /* 查看描述 */;
  // 视图
  template<class T>
  constexpr bool enable_view = /* 查看描述 */;
  struct view_base
  {};
  template<class T>
  concept view = /* 查看描述 */;
  // 其他范围精化
  template<class R, class T>
  concept output_range = /* 查看描述 */;
  template<class T>
  concept input_range = /* 查看描述 */;
  template<class T>
  concept forward_range = /* 查看描述 */;
  template<class T>
  concept bidirectional_range = /* 查看描述 */;
  template<class T>
  concept random_access_range = /* 查看描述 */;
  template<class T>
  concept contiguous_range = /* 查看描述 */;
  template<class T>
  concept common_range = /* 查看描述 */;
  template<class T>
  concept viewable_range = /* 查看描述 */;
  template<class T>
  concept constant_range = /* 查看描述 */;
  // 类模板 view_interface
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class view_interface;
  // 子范围
  enum class subrange_kind : bool
  {
    unsized,
    sized
  };
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K =
             /* 查看描述 */>
    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 {
  // 悬垂迭代器处理
  struct dangling;
  // class template elements_of
  template<range R, class Allocator = allocator<byte>>
  struct elements_of; // hosted
  template<range R>
  using borrowed_iterator_t = /* 查看描述 */;
  template<range R>
  using borrowed_subrange_t = /* 查看描述 */;
  // 范围转换
  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);
  // 空视图
  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{};
  }
  // 单视图
  template<move_constructible T>
    requires is_object_v<T>
  class single_view;
  namespace views {
    inline constexpr /* 未指定 */ single = /* 未指定 */;
  }
  template<bool Const, class T>
  using /*可能为常量*/ = conditional_t<Const, const T, T>; // 仅用于说明
  // 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 /* 未指定 */ iota = /* 未指定 */;
  }
  // 重复视图
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
    requires /* 查看描述 */
  class repeat_view;
  namespace views {
    inline constexpr /* 未指定 */ repeat = /* 未指定 */;
  }
  // istream 视图
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
    requires                /* 查看描述 */
  class basic_istream_view; // hosted
  template<class Val>
  using istream_view = basic_istream_view<Val, char>; // hosted
  template<class Val>
  using wistream_view = basic_istream_view<Val, wchar_t>; // hosted
  namespace views {
    template<class T>
    constexpr /* 未指定 */ istream = /* 未指定 */; // hosted
  }
  // range adaptor objects
  template<class D>
    requires is_class_v<D> && same_as<D, remove_cv_t<D>>
  class range_adaptor_closure
  {};
  // 全部视图
  namespace views {
    inline constexpr /* 未指定 */ all = /* 未指定 */;
    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;
  // 拥有视图
  template<range R>
    requires /* 查看描述 */
  class owning_view;
  template<class T>
  constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>;
  // 作为右值视图
  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 /* 未指定 */ as_rvalue = /* 未指定 */;
  }
  // 筛选视图
  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 /* 未指定 */ filter = /* 未指定 */;
  }
  // transform view
  template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> &&
             /*可引用*/<invoke_result_t<F&, range_reference_t<V>>>
  class transform_view;
  namespace views {
    inline constexpr /* 未指定 */ transform = /* 未指定 */;
  }
  // 获取视图
  template<view>
  class take_view;
  template<class T>
  constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* 未指定 */ take = /* 未指定 */;
  }
  // take while view
  template<view V, class Pred>
    requires input_range<V> && is_object_v<Pred> &&
             indirect_unary_predicate<const Pred, iterator_t<V>>
  class take_while_view;
  namespace views {
    inline constexpr /* 未指定 */ take_while = /* 未指定 */;
  }
  // 删除视图
  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 /* 未指定 */ drop = /* 未指定 */;
  }
  // drop while view
  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 /* 未指定 */ drop_while = /* 未指定 */;
  }
  // join view
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view;
  namespace views {
    inline constexpr /* 未指定 */ join = /* 未指定 */;
  }
  // 使用视图进行连接
  template<input_range V, forward_range Pattern>
    requires /* 查看描述 */
  class join_with_view;
  namespace views {
    inline constexpr /* 未指定 */ join_with = /* 未指定 */;
  }
  // 惰性分割视图
  template<class R>
  concept /*tiny-range*/ = /* 查看描述 */; // 仅用于说明
  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;
  // 分割视图
  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 /* 未指定 */ lazy_split = /* 未指定 */;
    inline constexpr /* 未指定 */ split      = /* 未指定 */;
  }
  // 拼接视图
  template<input_range... 视图>
    requires /* 查看描述 */
  class concat_view;
  namespace views {
    inline constexpr /* 未指定 */ concat = /* 未指定 */;
  }
  // 计数视图
  namespace views {
    inline constexpr /* 未指定 */ counted = /* 未指定 */;
  }
  // 通用视图
  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 /* 未指定 */ common = /* 未指定 */;
  }
  // 反向视图
  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 /* 未指定 */ reverse = /* 未指定 */;
  }
  // as const view
  template<input_range R>
  constexpr auto& /*可能为常量的范围*/(R& r) noexcept
  { // 仅用于说明
    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 /* 未指定 */ as_const = /* 未指定 */;
  }
  // 元素视图
  template<input_range V, size_t N>
    requires /* 查看描述 */
  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 /* 未指定 */ elements = /* 未指定 */;
    inline constexpr auto keys           = elements<0>;
    inline constexpr auto values         = elements<1>;
  }
  // 枚举视图
  template<view V>
    requires /* 查看描述 */
  class enumerate_view;
  template<class View>
  constexpr bool enable_borrowed_range<enumerate_view<View>> =
    enable_borrowed_range<View>;
  namespace views {
    inline constexpr /* 未指定 */ enumerate = /* 未指定 */;
  }
  // zip 视图
  template<input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view;
  template<class... 视图>
  constexpr bool enable_borrowed_range<zip_view<Views...>> =
    (enable_borrowed_range<Views> && ...);
  namespace views {
    inline constexpr /* 未指定 */ zip = /* 未指定 */;
  }
  // zip 变换视图
  template<move_constructible F, input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*可引用*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view;
  namespace views {
    inline constexpr /* 未指定 */ zip_transform = /* 未指定 */;
  }
  // 相邻视图
  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 /* 未指定 */ adjacent = /* 未指定 */;
    inline constexpr auto pairwise       = adjacent<2>;
  }
  // adjacent transform view
  template<forward_range V, move_constructible F, size_t N>
    requires /* 查看描述 */
  class adjacent_transform_view;
  namespace views {
    template<size_t N>
    constexpr /* 未指定 */ adjacent_transform = /* 未指定 */;
    inline constexpr auto pairwise_transform       = adjacent_transform<2>;
  }
  // 区块视图
  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 /* 未指定 */ chunk = /* 未指定 */;
  }
  // 幻灯片视图
  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 /* 未指定 */ slide = /* 未指定 */;
  }
  // chunk by view
  template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
  class chunk_by_view;
  namespace views {
    inline constexpr /* 未指定 */ chunk_by = /* 未指定 */;
  }
  // stride view
  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 /* 未指定 */ stride = /* 未指定 */;
  }
  // 笛卡尔积视图
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  class cartesian_product_view;
  namespace views {
    inline constexpr /* 未指定 */ cartesian_product = /* 未指定 */;
  }
  // 缓存最新视图
  template<input_range V>
    requires view<V>
  class cache_latest_view;
  namespace views {
    inline constexpr /* 未指定 */ cache_latest = /* 未指定 */;
  }
  // 输入视图
  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 /* 未指定 */ to_input = /* 未指定 */;
  }
}
namespace std {
  namespace views = ranges::浏览量;
  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{};
}

概念 range

namespace std::ranges {
  template<class T>
  concept range = requires(T& t) {
    ranges::begin(t); // 有时保持相等性(参见描述)
    ranges::end(t);
  };
}

概念 borrowed_range

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

概念 approximately_sized_range

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

概念 sized_range

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

概念 view

namespace std::ranges {
  template<class T>
  constexpr bool /*is-derived-from-view-interface*/ =
    /* 见描述 */; // 仅用于说明
  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>;
}

概念 output_range

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

概念 input_range

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

概念 forward_range

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

概念 bidirectional_range

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

概念 random_access_range

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

概念 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>>>;
    };
}

概念 common_range

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

概念 viewable_range

namespace std::ranges {
  template<class T>
  concept viewable_range =
    range<T> && ((view<remove_cvref_t<T>> && constructible_from<remove_cvref_t<T>, T>) ||
                 (!view<remove_cvref_t<T>> &&
                  (is_lvalue_reference_v<T> ||
                   (movable<remove_reference_t<T>> && !/*is-initializer-list*/<T>))));
}

概念 constant_range

namespace std::ranges {
  template<class T>
  concept constant_range = input_range<T> && /*常量迭代器*/<iterator_t<T>>;
}

辅助概念

注意:本节中的概念仅用于说明,不属于接口的一部分。

namespace std::ranges { // 未指定,仅用于名称查找
  template<class R>
  concept /*simple-view*/ = // 仅用于说明
    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*/ = // 仅用于说明
    input_iterator<I> && (is_pointer_v<I> || requires(const I i) { i.operator->(); });
  template<class T, class U>
  concept /*different-from*/ = // 仅用于说明
    !same_as<remove_cvref_t<T>, remove_cvref_t<U>>;
  template<class R>
  concept /*range-with-movable-references*/ = // 仅用于说明
    input_range<R> && move_constructible<range_reference_t<R>> &&
    move_constructible<range_rvalue_reference_t<R>>;
  template<class R>
  constexpr bool /*is-initializer-list*/ = /* 见描述 */; // 仅用于说明
  template<class T>
  constexpr auto
  /*as-const-pointer*/(const T* p) noexcept
  {
    return p;
  } // 仅用于说明
}

类模板 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& /*派生类*/() noexcept
    { // 仅用于说明
      return static_cast<D&>(*this);
    }
    constexpr const D& /*派生类*/() const noexcept
    { // 仅用于说明
      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(/*派生类*/()) == 0;
      else
        return ranges::begin(/*派生类*/()) == ranges::end(/*派生类*/());
    }
    constexpr bool empty() const
      requires sized_range<const D> || forward_range<const D>
    {
      if constexpr (sized_range<const D>)
        return ranges::size(/*派生类*/()) == 0;
      else
        return ranges::begin(/*派生类*/()) == ranges::end(/*派生类*/());
    }
    constexpr auto cbegin()
      requires input_range<D>
    {
      return ranges::cbegin(/*派生类*/());
    }
    constexpr auto cbegin() const
      requires input_range<const D>
    {
      return ranges::cbegin(/*派生类*/());
    }
    constexpr auto cend()
      requires input_range<D>
    {
      return ranges::cend(/*派生类*/());
    }
    constexpr auto cend() const
      requires input_range<const D>
    {
      return ranges::cend(/*派生类*/());
    }
    constexpr explicit operator bool()
      requires requires { ranges::empty(/*派生类*/()); }
    {
      return !ranges::empty(/*派生类*/());
    }
    constexpr explicit operator bool() const
      requires requires { ranges::empty(/*派生类*/()); }
    {
      return !ranges::empty(/*派生类*/());
    }
    constexpr auto data()
      requires contiguous_iterator<iterator_t<D>>
    {
      return to_address(ranges::begin(/*派生类*/()));
    }
    constexpr auto data() const
      requires range<const D> && contiguous_iterator<iterator_t<const D>>
    {
      return to_address(ranges::begin(/*派生类*/()));
    }
    constexpr auto size()
      requires forward_range<D> && sized_sentinel_for<sentinel_t<D>, iterator_t<D>>
    {
      return /*to-unsigned-like*/(ranges::end(/*派生类*/()) -
                                  ranges::begin(/*派生类*/()));
    }
    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(/*派生类*/()) -
                                  ranges::begin(/*派生类*/()));
    }
    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(/*派生类*/())[n];
    }
    template<random_access_range R = const D>
    constexpr decltype(auto) operator[](range_difference_t<R> n) const
    {
      return ranges::begin(/*派生类*/())[n];
    }
  };
}

类模板 std::ranges::subrange

namespace std::ranges {
  template<class From, class To>
  concept /*使用非限定指针转换*/ = // exposition-only
    is_pointer_v<From> && is_pointer_v<To> &&
    !convertible_to<remove_pointer_t<From> (*)[], remove_pointer_t<To> (*)[]>;
  template<class From, class To>
  concept /*可转换为非切片*/ = // 仅用于说明
    convertible_to<From, To> &&
    !/*使用非限定指针转换*/<decay_t<From>, decay_t<To>>;
  template<class T, class U, class V>
  concept /*pair-like-convertible-from*/ = // exposition-only
    !range<T> && !is_reference_v<T> && /*pair-like*/<T> && constructible_from<T, U, V> &&
    /*可转换为非切片*/<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 /*存储大小*/ = // 仅用于说明
      K == subrange_kind::sized && !sized_sentinel_for<S, I>;
    I /*begin_*/ = I(); // 仅用于说明
    S /*结束_*/   = S(); // exposition-only
    /*make-unsigned-like-t*/<iter_difference_t<I>> /*size_*/ =
      0; // 仅用于说明性展示
         // 如果 StoreSize 为 true
  public:
    subrange()
      requires default_initializable<I>
    = default;
    constexpr subrange(/*可转换为非切片*/<I> auto i, S s)
      requires(!/*StoreSize*/);
    constexpr subrange(/*可转换为非切片*/<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> && /*可转换为非切片*/<iterator_t<R>, I> &&
               convertible_to<sentinel_t<R>, S>
               constexpr subrange(R&& r)
                 requires(!/*StoreSize*/ || sized_range<R>);
    template<borrowed_range R>
      requires /*可转换为非切片*/<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</*different-from*/<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>;
}

std::ranges::dangling

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

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

类模板 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; }
  };
}

类模板 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_*/; // 仅用于说明
  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>;
}

类模板 std::ranges::iota_view

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

类模板 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(); // 仅用于说明
  public:
    using iterator_concept = /* 见描述 */;
    using iterator_category =
      input_iterator_tag; // 仅当 W 满足 incrementable 且
                          // IOTA-DIFF-T(W) 为整数类型时存在
    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>;
  };
}

类模板 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(); // 仅用于说明
  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>;
  };
}

类模板 std::ranges::repeat_view

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

类模板 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*/ = // 仅用于说明
      conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>;
    const T* /*value_*/         = nullptr;          // 仅用于说明
    /*index-type*/ /*current_*/ = /*index-type*/(); // 仅用于说明
    constexpr explicit /*iterator*/(
      const T* value,
      /*index-type*/ b = /*index-type*/()); // 仅用于说明
  public:
    using iterator_concept  = random_access_iterator_tag;
    using iterator_category = random_access_iterator_tag;
    using value_type        = T;
    using difference_type   = /* 见描述 */;
    /*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);
  };
}

类模板 std::ranges::basic_istream_view

namespace std::ranges {
  template<class Val, class CharT, class Traits>
  concept /*stream-extractable*/ = // 仅用于说明
    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:
    // 类 basic_istream_view::iterator
    struct /*iterator*/;                       // 仅用于说明
    basic_istream<CharT, Traits>* /*stream_*/; // 仅用于说明
    Val /*value_*/ = Val();                    // 仅用于说明
  };
}

类模板 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_*/; // 仅用于说明
  };
}

类模板 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_*/; // 仅用于说明
  public:
    template</*different-from*/<ref_view> T>
      requires /* 参见描述 */
      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>;
}

类模板 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(); // 仅用于说明
  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_*/);
    }
  };
}

类模板 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(); // 仅用于说明
  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>>;
}

类模板 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();               // 仅用于说明
    /*movable-box*/<Pred> /*pred_*/; // 仅用于说明
    // filter_view::iterator 类
    class /*iterator*/; // 仅用于说明
    // filter_view::sentinel 类
    class /*sentinel*/; // 仅用于说明
  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>;
}

类模板 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>(); // 仅用于说明
    filter_view* /*parent_*/   = nullptr;         // 仅用于说明
  public:
    using iterator_concept  = /* 见描述 */;
    using iterator_category = /* 见描述 */; // 不总是存在
    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>>;
  };
}

类模板 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>(); // 仅用于说明
  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);
  };
}

类模板 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:
    // 类模板 transform_view::iterator
    template<bool>
    struct /*iterator*/; // 仅用于说明
    // 类模板 transform_view::sentinel
    template<bool>
    struct /*sentinel*/; // 仅用于说明
    V /*base_*/ = V();           // 仅用于说明
    /*movable-box*/<F> /*fun_*/; // 仅用于说明
  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>;
}

类模板 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>> &&
             /*可引用*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*iterator*/
  {
  private:
    using /*Parent*/ = /*可能为常量*/<Const, transform_view>;  // exposition-only
    using /*Base*/   = /*可能为常量*/<Const, V>;               // exposition-only
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition-only
    /*Parent*/* /*父级_*/           = nullptr;                // exposition-only
  public:
    using iterator_concept  = /* 查看描述 */;
    using iterator_category = /* 查看描述 */; // 并非始终存在
    using value_type        = remove_cvref_t<
      invoke_result_t</*可能为常量*/<Const, F>&, range_reference_t</*Base*/>>>;
    using difference_type = range_difference_t</*Base*/>;
    /*iterator*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*iterator*/(/*Parent*/& parent, iterator_t</*Base*/> current);
    constexpr /*iterator*/(/*iterator*/<!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 /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

类模板 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>; // 仅用于说明
    using /*Base*/   = /*maybe-const*/<Const, V>;              // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // 仅用于说明
  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);
  };
}

类模板 std::ranges::take_view

namespace std::ranges {
  template<view V>
  class take_view : public view_interface<take_view<V>>
  {
  private:
    V /*base_*/                      = V(); // exposition-only
    range_difference_t<V> /*count_*/ = 0;   // exposition-only
    // 类模板 take_view::sentinel
    template<bool>
    class /*哨兵*/; // exposition-only
  public:
    take_view()
      requires default_initializable<V>
    = default;
    constexpr explicit take_view(V base, range_difference_t<V> count);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*简单视图*/<V>)
    {
      if constexpr (sized_range<V>) {
        if constexpr (random_access_range<V>) {
          return ranges::begin(/*base_*/);
        } else {
          auto sz = range_difference_t<V>(size());
          return counted_iterator(ranges::begin(/*base_*/), sz);
        }
      } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) {
        auto it = ranges::begin(/*base_*/);
        auto sz = std::min(/*count_*/, ranges::end(/*base_*/) - it);
        return counted_iterator(std::move(it), sz);
      } else {
        return counted_iterator(ranges::begin(/*base_*/), /*count_*/);
      }
    }
    constexpr auto begin() const
      requires range<const V>
    {
      if constexpr (sized_range<const V>) {
        if constexpr (random_access_range<const V>) {
          return ranges::begin(/*base_*/);
        } else {
          auto sz = range_difference_t<const V>(size());
          return counted_iterator(ranges::begin(/*base_*/), sz);
        }
      } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
        auto it = ranges::begin(/*base_*/);
        auto sz = std::min(/*count_*/, ranges::end(/*base_*/) - it);
        return counted_iterator(std::move(it), sz);
      } else {
        return counted_iterator(ranges::begin(/*base_*/), /*count_*/);
      }
    }
    constexpr auto end()
      requires(!/*简单视图*/<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 /*哨兵*/<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 /*哨兵*/<true>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto size()
      requires sized_range<V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*count_*/));
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*count_*/));
    }
    constexpr auto reserve_hint()
    {
      if constexpr (approximately_sized_range<V>) {
        auto n = static_cast<range_difference_t<V>>(ranges::reserve_hint(/*base_*/));
        return /*to-unsigned-like*/(ranges::min(n, /*count_*/));
      }
      return /*to-unsigned-like*/(/*count_*/);
    }
    constexpr auto reserve_hint() const
    {
      if constexpr (approximately_sized_range<const V>) {
        auto n =
          static_cast<range_difference_t<const V>>(ranges::reserve_hint(/*base_*/));
        return /*to-unsigned-like*/(ranges::min(n, /*count_*/));
      }
      return /*to-unsigned-like*/(/*count_*/);
    }
  };
  template<class R>
  take_view(R&&, range_difference_t<R>) -> take_view<views::all_t<R>>;
}

类模板 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>; // 仅用于说明
    template<bool OtherConst>
    using /*CI*/ =
      counted_iterator<iterator_t</*maybe-const*/<OtherConst, V>>>; // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();         // 仅用于说明
  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);
  };
}

类模板 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>>
  {
    // 类模板 take_while_view::sentinel
    template<bool>
    class /*sentinel*/; // 仅用于说明
    V /*base_*/ = V();               // 仅用于说明
    /*movable-box*/<Pred> /*pred_*/; // 仅用于说明
  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>;
}

类模板 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>; // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 仅用于说明
    const Pred* /*pred_*/         = nullptr;                // 仅用于说明
  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);
  };
}

类模板 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(); // 仅用于说明
    range_difference_t<V> /*count_*/ = 0;   // 仅用于说明
  };
  template<class R>
  drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;
}

类模板 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();               // 仅用于说明
    /*movable-box*/<Pred> /*pred_*/; // 仅用于说明
  };
  template<class R, class Pred>
  drop_while_view(R&&, Pred) -> drop_while_view<views::all_t<R>, Pred>;
}

类模板 std::ranges::join_view

namespace std::范围 {
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view : public view_interface<join_view<V>>
  {
  private:
    using /*InnerRng*/ = range_reference_t<V>; // exposition-only
    // class template join_view::iterator
    template<bool Const>
    struct /*iterator*/; // exposition-only
    // 类模板 join_view::sentinel
    template<bool Const>
    struct /*哨兵*/; // exposition-only
    V /*base_*/ = V(); // exposition-only
    /*non-propagating-cache*/<iterator_t<V>> /*outer_*/; // 仅用于说明性展示
                                                         // when !forward_range<V>
    /*non-propagating-cache*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/; // 仅用于说明性展示
                  // 如果 is_reference_v<InnerRng> 为 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 = /*简单视图*/<V> && is_reference_v</*InnerRng*/>;
        return /*iterator*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*outer_*/ = ranges::begin(/*base_*/);
        return /*iterator*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>>
    {
      return /*iterator*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
    {
      if constexpr (forward_range<V> && is_reference_v</*InnerRng*/> &&
                    forward_range</*InnerRng*/> && common_range<V> &&
                    common_range</*InnerRng*/>)
        return /*iterator*/</*简单视图*/<V>>{ *this, ranges::end(/*base_*/) };
      else
        return /*哨兵*/</*简单视图*/<V>>{ *this };
    }
    constexpr auto end() const
      requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>>
    {
      if constexpr (forward_range<range_reference_t<const V>> && common_range<const V> &&
                    common_range<range_reference_t<const V>>)
        return /*iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*哨兵*/<true>{ *this };
    }
  };
  template<class R>
  explicit join_view(R&&) -> join_view<views::all_t<R>>;
}

类模板 std::ranges::join_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  template<bool Const>
  struct join_view<V>::/*iterator*/
  {
  private:
    using /*Parent*/    = /*可能为常量*/<Const, join_view>;       // exposition-only
    using /*Base*/      = /*可能为常量*/<Const, V>;               // exposition-only
    using /*OuterIter*/ = iterator_t</*Base*/>;                    // exposition-only
    using /*InnerIter*/ = iterator_t<range_reference_t</*Base*/>>; // exposition-only
    static constexpr bool /*ref-is-glvalue*/ = // exposition-only
      is_reference_v<range_reference_t</*Base*/>>;
    /*OuterIter*/ /*outer_*/ = /*OuterIter*/(); // 仅用于说明性展示
                                                // 如果 Base 满足 forward_range 概念
    optional</*内部迭代器*/> /*inner_*/;         // exposition-only
    /*父类*/* /*parent_*/ = nullptr;          // exposition-only
    constexpr void /*satisfy*/(); // exposition-only
    constexpr /*OuterIter*/& /*外层*/();             // exposition-only
    constexpr const /*OuterIter*/& /*外层*/() const; // 仅用于说明
    constexpr /*iterator*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposition-only
    constexpr explicit /*iterator*/(/*父类*/& parent)
      requires(!forward_range</*Base*/>); // 仅用于说明
  public:
    using iterator_concept  = /* 查看描述 */;
    using iterator_category = /* 查看描述 */; // 并非始终存在
    using value_type        = range_value_t<range_reference_t</*Base*/>>;
    using difference_type   = /* 查看描述 */;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, /*OuterIter*/> &&
               convertible_to<iterator_t</*InnerRng*/>, /*InnerIter*/>;
    constexpr decltype(auto) operator*() const { return **/*inner_*/; }
    constexpr /*内部迭代器*/ operator->() const
      requires /*has-arrow*/</*内部迭代器*/> && copyable</*InnerIter*/>;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*ref-is-glvalue*/
               && forward_range</*Base*/> && forward_range<range_reference_t</*Base*/>>;
    constexpr /*iterator*/& operator--()
      requires /*ref-is-glvalue*/ && bidirectional_range</*Base*/> &&
               bidirectional_range<range_reference_t</*Base*/>> &&
               common_range<range_reference_t</*Base*/>>;
    constexpr /*iterator*/ operator--(int)
      requires /*ref-is-glvalue*/ && bidirectional_range</*Base*/> &&
               bidirectional_range<range_reference_t</*Base*/>> &&
               common_range<range_reference_t</*Base*/>>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires /*ref-is-glvalue*/ && forward_range</*Base*/> &&
               equality_comparable<iterator_t<range_reference_t</*Base*/>>>;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& i) noexcept(
      noexcept(ranges::iter_move(*i./*inner_*/)))
    {
      return ranges::iter_move(*i./*inner_*/);
    }
    friend constexpr void iter_swap(
      const /*iterator*/& x,
      const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(*x./*inner_*/,
                                                                 *y./*inner_*/)))
      requires indirectly_swappable</*InnerIter*/>;
  };
}

类模板 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>; // 仅用于说明
    using /*Base*/                = /*maybe-const*/<Const, V>;         // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();            // 仅用于说明
  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);
  };
}

类模板 std::ranges::join_with_view

namespace std::ranges {
  template<class R>
  concept /*双向通用*/ =
    bidirectional_range<R> && common_range<R>; // exposition-only
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>> && view<Pattern> &&
             /*可连接的*/<range_reference_t<V>, Pattern>
  class join_with_view : public view_interface<join_with_view<V, Pattern>>
  {
    using /*InnerRng*/ = range_reference_t<V>; // exposition-only
    V /*base_*/        = V();                               // exposition-only
    /*non-propagating-cache*/<iterator_t<V>> /*外部迭代器*/; // 仅用于说明性展示
                                                            // 仅当 !forward_range<V>
    /*non-propagating-cache*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/;                     // 仅用于说明性展示
                                      // 如果 is_reference_v<InnerRng> 为 false
    Pattern /*模式_*/ = Pattern(); // exposition-only
    // 类模板 join_with_view::iterator
    template<bool Const>
    struct /*iterator*/; // exposition-only
    // 类模板 join_with_view::sentinel
    template<bool Const>
    struct /*哨兵*/; // exposition-only
  public:
    join_with_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit join_with_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t<R>> &&
               constructible_from<Pattern, single_view<range_value_t</*InnerRng*/>>>
    constexpr explicit join_with_view(R&& r, range_value_t</*InnerRng*/> e);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        constexpr bool use_const =
          /*简单视图*/<V> && is_reference_v</*InnerRng*/> && /*简单视图*/<Pattern>;
        return /*iterator*/<use_const>{ *this, ranges::begin(/*base_*/) };
      } else {
        /*外部迭代器*/ = ranges::begin(/*base_*/);
        return /*iterator*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<const V> && forward_range<const Pattern> &&
               is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>> &&
               /*可连接的*/<range_reference_t<const V>, const Pattern>
    {
      return /*iterator*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
    {
      if constexpr (forward_range<V> && is_reference_v</*InnerRng*/> &&
                    forward_range</*InnerRng*/> && common_range<V> &&
                    common_range</*InnerRng*/>)
        return /*iterator*/ < /*简单视图*/<V> &&
               /*简单视图*/ < Pattern >> { *this, ranges::end(/*base_*/) };
      else
        return /*哨兵*/ < /*简单视图*/<V> &&
               /*简单视图*/ < 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>> &&
               /*可连接的*/<range_reference_t<const V>, const Pattern>
    {
      using InnerConstRng = range_reference_t<const V>;
      if constexpr (forward_range<InnerConstRng> && common_range<const V> &&
                    common_range<InnerConstRng>)
        return /*iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*哨兵*/<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>>>>;
}

类模板 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> &&
             /*可连接的*/<range_reference_t<V>, Pattern>
  template<bool Const>
  class join_with_view<V, Pattern>::/*iterator*/
  {
    using /*Parent*/      = /*可能为常量*/<Const, join_with_view>; // exposition-only
    using /*Base*/        = /*可能为常量*/<Const, V>;              // exposition-only
    using /*InnerBase*/   = range_reference_t</*Base*/>;            // exposition-only
    using /*PatternBase*/ = /*可能为常量*/<Const, Pattern>;        // exposition-only
    using /*OuterIter*/   = iterator_t</*Base*/>;        // exposition-only
    using /*InnerIter*/   = iterator_t</*InnerBase*/>;   // exposition-only
    using /*PatternIter*/ = iterator_t</*PatternBase*/>; // exposition-only
    static constexpr bool /*ref-is-glvalue*/ =
      is_reference_v</*InnerBase*/>; // exposition-only
    /*Parent*/* /*parent_*/     = nullptr;                 // exposition-only
    /*OuterIter*/ /*外部迭代器*/ = /*OuterIter*/();         // 仅用于说明性展示
                                                           // 如果 Base 满足 forward_range 概念
    variant</*PatternIter*/, /*InnerIter*/> /*内部迭代器*/; // exposition-only
    constexpr /*iterator*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposition-only
    constexpr explicit /*iterator*/(/*父类*/& parent)
      requires(!forward_range</*Base*/>);             // exposition-only
    constexpr /*OuterIter*/& /*外层*/();             // 仅用于说明
    constexpr const /*OuterIter*/& /*外层*/() const; // exposition-only
    constexpr auto& /*update-inner*/();               // exposition-only
    constexpr auto& /*get-inner*/();                  // exposition-only
    constexpr void /*satisfy*/();                     // exposition-only
  public:
    using iterator_concept  = /* 查看描述 */;
    using iterator_category = /* 查看描述 */; // 并非始终存在
    using value_type        = /* 查看描述 */;
    using difference_type   = /* 查看描述 */;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, /*OuterIter*/> &&
               convertible_to<iterator_t</*InnerRng*/>, /*InnerIter*/> &&
               convertible_to<iterator_t<Pattern>, /*PatternIter*/>;
    constexpr decltype(auto) operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*ref-is-glvalue*/
               && forward_iterator</*OuterIter*/> && forward_iterator</*InnerIter*/>;
    constexpr /*iterator*/& operator--()
      requires /*ref-is-glvalue*/ && bidirectional_range</*Base*/> &&
               /*双向通用*/</*InnerBase*/> &&
               /*bidirectional-common*/</*PatternBase*/>;
    constexpr /*iterator*/ operator--(int)
      requires /*ref-is-glvalue*/ && bidirectional_range</*Base*/> &&
               /*bidirectional-common*/</*InnerBase*/> &&
               /*双向通用*/</*PatternBase*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires /*ref-is-glvalue*/
               && forward_range</*Base*/> && equality_comparable</*InnerIter*/>;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& x)
    {
      using rvalue_reference =
        common_reference_t<iter_rvalue_reference_t</*InnerIter*/>,
                           iter_rvalue_reference_t</*PatternIter*/>>;
      return visit<rvalue_reference>(ranges::iter_move, x./*内部迭代器*/);
    }
    friend constexpr void iter_swap(const /*iterator*/& x, const /*iterator*/& y)
      requires indirectly_swappable</*InnerIter*/, /*PatternIter*/>
    {
      visit(ranges::iter_swap, x./*内部迭代器*/, y./*inner-it_*/);
    }
  };
}

类模板 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> &&
             /*可连接类型*/<range_reference_t<V>, Pattern>
  template<bool Const>
  class join_with_view<V, Pattern>::/*哨兵*/
  {
    using /*父类型*/ = /*可能常量限定*/<Const, join_with_view>; // 仅用于说明
    using /*基类型*/   = /*可能常量限定*/<Const, V>;              // 仅用于说明
    sentinel_t</*基类型*/> /*结束标记_*/ = sentinel_t</*基类型*/>();    // 仅用于说明
    constexpr explicit /*哨兵*/(/*父类型*/& parent); // 仅用于说明
  public:
    /*哨兵*/() = default;
    constexpr /*哨兵*/(/*哨兵*/<!Const> s)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*基类型*/>>;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*基类型*/>,
                            iterator_t</*可能常量限定*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*迭代器*/<OtherConst>& x,
                                     const /*哨兵*/& y);
  };
}

类模板 std::ranges::lazy_split_view

namespace std::ranges {
  template<auto>
  struct /*require-constant*/; // exposition-only
  template<class R>
  concept /*tiny-range*/ = // exposition-only
    sized_range<R> && requires {
      typename /*require-constant*/<remove_reference_t<R>::size()>;
    } && (remove_reference_t<R>::size() <= 1);
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>>
  {
  private:
    V /*base_*/          = V();       // exposition-only
    Pattern /*模式_*/ = Pattern(); // exposition-only
    /*non-propagating-cache*/<iterator_t<V>> /*current_*/; // 仅用于说明性展示
                                                           // if forward_range<V> is false
    // 类模板 lazy_split_view::outer-iterator
    template<bool>
    struct /*外部迭代器*/; // exposition-only
    // 类模板 lazy_split_view::inner-iterator
    template<bool>
    struct /*内部迭代器*/; // exposition-only
  public:
    lazy_split_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit lazy_split_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t<R>> &&
               constructible_from<Pattern, single_view<range_value_t<R>>>
    constexpr explicit lazy_split_view(R&& r, range_value_t<R> e);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        return /*外部迭代器*/ < /*简单视图*/<V> &&
               /*简单视图*/ < Pattern >> { *this, ranges::begin(/*base_*/) };
      } else {
        /*current_*/ = ranges::begin(/*base_*/);
        return /*外部迭代器*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<V> && forward_range<const V>
    {
      return /*外部迭代器*/<true>{ *this, ranges::begin(/*base_*/) };
    }
    constexpr auto end()
      requires forward_range<V> && common_range<V>
    {
      return /*外部迭代器*/ < /*简单视图*/<V> &&
             /*简单视图*/ < Pattern >> { *this, ranges::end(/*base_*/) };
    }
    constexpr auto end() const
    {
      if constexpr (forward_range<V> && forward_range<const V> && common_range<const V>)
        return /*外部迭代器*/<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>>>;
}

类模板 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>; // 仅用于说明
    using /*Base*/          = /*maybe-const*/<Const, V>;               // 仅用于说明
    /*Parent*/* /*parent_*/ = nullptr;                                 // 仅用于说明
    iterator_t</*Base*/> /*current_*/ =
      iterator_t</*Base*/>(); // 仅用于说明,仅当 V 满足 forward_range 时存在
                              // 如果 V 满足 forward_range
    bool /*trailing-empty_*/ = false; // 仅用于说明
  public:
    using iterator_concept =
      conditional_t<forward_range</*Base*/>, forward_iterator_tag, input_iterator_tag>;
    using iterator_category = input_iterator_tag; // 仅当 Base 满足 forward_range 时存在
                                                  // 如果 Base 满足 forward_range
    // 类 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);
  };
}

类模板 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*/(); // 仅用于说明
    constexpr explicit value_type(/*outer-iterator*/ i); // 仅用于说明
  public:
    constexpr /*inner-iterator*/<Const> begin() const;
    constexpr default_sentinel_t end() const noexcept;
  };
}

类模板 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>;   // 仅用于说明
    /*outer-iterator*/<Const> /*i_*/ = /*outer-iterator*/<Const>(); // 仅用于说明
    bool /*incremented_*/            = false;                       // 仅用于说明
  public:
    using iterator_concept  = typename /*outer-iterator*/<Const>::iterator_concept;
    using iterator_category = /* 见描述 */; // 仅当 Base 满足 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*/>>;
  };
}

类模板 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();       // 仅用于说明
    Pattern /*pattern_*/ = Pattern(); // 仅用于说明
    // 类 split_view::iterator
    struct /*iterator*/; // 仅用于说明
    // 类 split_view::sentinel
    struct /*sentinel*/; // 仅用于说明
  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>); // 仅用于说明
  };
  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>>>;
}

类模板 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>::/*迭代器*/
  {
  private:
    split_view* /*parent_*/           = nullptr;                   // 仅用于说明
    iterator_t<V> /*cur_*/            = iterator_t<V>();           // 仅用于说明
    subrange<iterator_t<V>> /*next_*/ = subrange<iterator_t<V>>(); // 仅用于说明
    bool /*trailing-empty_*/          = false;                     // 仅用于说明
  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>;
    /*迭代器*/()          = default;
    constexpr /*迭代器*/(split_view& parent,
                           iterator_t<V> current,
                           subrange<iterator_t<V>> next);
    constexpr iterator_t<V> base() const;
    constexpr value_type operator*() const;
    constexpr /*迭代器*/& operator++();
    constexpr /*迭代器*/ operator++(int);
    friend constexpr bool operator==(const /*迭代器*/& x, const /*迭代器*/& y);
  };
}

类模板 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>(); // 仅用于说明
  public:
    /*sentinel*/() = default;
    constexpr explicit /*sentinel*/(split_view& parent);
    friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y);
  };
}

类模板 std::ranges::concat

namespace std::ranges {
  template<class... Rs>
  using /*concat-reference-t*/ =
    common_reference_t<range_reference_t<Rs>...>; // 仅用于说明
  template<class... Rs>
  using /*concat-value-t*/ = common_type_t<range_value_t<Rs>...>; // 仅用于说明
  template<class... Rs>
  using /*concat-rvalue-reference-t*/ = // 仅用于说明
    common_reference_t<range_rvalue_reference_t<Rs>...>;
  template<class... Rs>
  concept /*concat-indirectly-readable*/ = /* 见描述 */; // 仅用于说明
  template<class... Rs>
  concept /*concatable*/ = /* 见描述 */; // 仅用于说明
  template<bool Const, class... Rs>
  concept /*concat-is-random-access*/ = /* 见描述 */; // 仅用于说明
  template<bool Const, class... Rs>
  concept /*concat-is-bidirectional*/ = /* 见描述 */; // 仅用于说明
  template<input_range... Views>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...>
  class concat_view : public view_interface<concat_view<Views...>>
  {
    tuple<Views...> /*views_*/; // 仅用于说明
    // 类模板 concat_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
  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>...>;
}

类模板 std::ranges::concat::iterator

namespace std::ranges {
  template<input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*可连接的*/<Views...>
  template<bool Const>
  class concat_view<Views...>::/*iterator*/
  {
  public:
    using iterator_category = /* 查看描述 */; // 不总是存在
    using iterator_concept  = /* 查看描述 */;
    using value_type        = /*concat-value-t*/</*可能为常量*/<Const, Views>...>;
    using difference_type =
      common_type_t<range_difference_t</*可能为常量*/<Const, Views>>...>;
  private:
    using /*base-iter*/ = // 仅用于说明
      variant<iterator_t</*可能为常量*/<Const, Views>>...>;
    /*可能为常量*/<Const, concat_view>* /*父级_*/ = nullptr; // exposition-only
    /*base-iter*/ /*it_*/;                                      // 仅用于说明
    template<size_t N>
    constexpr void /*satisfy*/(); // 仅用于说明
    template<size_t N>
    constexpr void /*prev*/(); // 仅用于说明
    template<size_t N>
    constexpr void /*advance-fwd*/(difference_type offset, // exposition-only
                                   difference_type steps);
    template<size_t N>
    constexpr void /*advance-bwd*/(difference_type offset, // exposition-only
                                   difference_type steps);
    template<class... Args>
    constexpr explicit /*iterator*/(
      /*可能为常量*/<Const, concat_view>* parent, // 仅用于说明
      Args&&... args)
      requires constructible_from</*base-iter*/, Args&&...>;
  public:
    /*iterator*/() = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr decltype(auto) operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*全向转发*/<Const, Views...>;
    constexpr /*iterator*/& operator--()
      requires /*concat-is-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/ operator--(int)
      requires /*concat-is-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires(equality_comparable<iterator_t</*可能为常量*/<Const, Views>>> && ...);
    friend constexpr bool operator==(const /*iterator*/& it, default_sentinel_t);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires(/*全随机访问*/<Const, Views...> &&
               (three_way_comparable<iterator_t</*可能为常量*/<Const, Views>>> && ...));
    friend constexpr /*iterator*/ operator+(const /*iterator*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& it)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& it, difference_type n)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires /*concat-is-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x, default_sentinel_t)
      requires /* 查看描述 */;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterator*/& x)
      requires /* 查看描述 */;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& it) noexcept(
      /* 查看描述 */);
    friend constexpr void iter_swap(const /*iterator*/& x,
                                    const /*iterator*/& y) noexcept(/* 查看描述 */)
      requires /* 查看描述 */;
  };
}

类模板 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(); // 仅用于说明
  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(!/*简单视图*/<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(!/*简单视图*/<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>>;
}

类模板 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(); // 仅用于说明
  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>>;
}

类模板 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(); // 仅用于说明
  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>>;
}

类模板 std::ranges::elements_view

namespace std::ranges {
  template<class T, size_t N>
  concept /*具有元组元素*/ = // exposition-only
    /*元组式*/<T> && N < tuple_size_v<T>;
  template<class T, size_t N>
  concept /*可返回元素*/ = // exposition-only
    is_reference_v<T> || move_constructible<tuple_element_t<N, T>>;
  template<input_range V, size_t N>
    requires view<V> && /*具有元组元素*/<range_value_t<V>, N> &&
             /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> &&
             /*可返回元素*/<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(!/*简单视图*/<V>)
    {
      return /*iterator*/<false>(ranges::begin(/*base_*/));
    }
    constexpr auto begin() const
      requires range<const V>
    {
      return /*iterator*/<true>(ranges::begin(/*base_*/));
    }
    constexpr auto end()
      requires(!/*简单视图*/<V> && !common_range<V>)
    {
      return /*哨兵*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end()
      requires(!/*简单视图*/<V> && common_range<V>)
    {
      return /*iterator*/<false>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires range<const V>
    {
      return /*哨兵*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires common_range<const V>
    {
      return /*iterator*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  private:
    // class template elements_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
    // 类模板 elements_view::sentinel
    template<bool>
    class /*哨兵*/; // 仅用于说明
    V /*base_*/ = V(); // 仅用于说明
  };
}

类模板 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> &&
             /*可返回元素*/<range_reference_t<V>, N>
  template<bool Const>
  class elements_view<V, N>::/*iterator*/
  {
    using /*Base*/                    = /*可能为常量*/<Const, V>; // exposition-only
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition-only
    static constexpr decltype(auto) /*获取元素*/(
      const iterator_t</*Base*/>& i); // exposition-only
  public:
    using iterator_concept  = /* 查看描述 */;
    using iterator_category = /* 查看描述 */; // 不总是存在
    using value_type        = remove_cvref_t<tuple_element_t<N, range_value_t</*Base*/>>>;
    using difference_type   = range_difference_t</*Base*/>;
    /*iterator*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr explicit /*iterator*/(iterator_t</*Base*/> current);
    constexpr /*iterator*/(/*iterator*/<!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 /*获取元素*/(/*current_*/); }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return /*获取元素*/(/*current_*/ + n);
    }
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

类模板 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>; // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // 仅用于说明
  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);
  };
}

类模板 std::ranges::enumerate_view

namespace std::范围 {
  template<view V>
    requires /*支持移动引用的范围*/<V>
  class enumerate_view : public view_interface<enumerate_view<V>>
  {
    V /*base_*/ = V(); // exposition-only
    // 类模板 enumerate_view::iterator
    template<bool Const>
    class /*iterator*/; // 仅用于说明
    // 类模板 enumerate_view::sentinel
    template<bool Const>
    class /*哨兵*/; // 仅用于说明
  public:
    constexpr enumerate_view()
      requires default_initializable<V>
    = default;
    constexpr explicit enumerate_view(V base);
    constexpr auto begin()
      requires(!/*简单视图*/<V>)
    {
      return /*iterator*/<false>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto begin() const
      requires /*支持移动引用的范围*/<const V>
    {
      return /*iterator*/<true>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto end()
      requires(!/*简单视图*/<V>)
    {
      if constexpr (forward_range<V> && common_range<V> && sized_range<V>)
        return /*iterator*/<false>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*哨兵*/<false>(ranges::end(/*base_*/));
    }
    constexpr auto end() const
      requires /*range-with-movable-references*/<const V>
    {
      if constexpr (forward_range<const V> && common_range<const V> &&
                    sized_range<const V>)
        return /*iterator*/<true>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*哨兵*/<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>>;
}

类模板 std::ranges::enumerate_view::iterator

namespace std::ranges {
  template<view V>
    requires /*range-with-movable-references*/<V>
  template<bool Const>
  class enumerate_view<V>::/*iterator*/
  {
    using /*Base*/ = /*可能为常量*/<Const, V>; // exposition-only
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 查看描述 */;
    using difference_type   = range_difference_t</*Base*/>;
    using value_type        = tuple<difference_type, range_value_t</*Base*/>>;
  private:
    using /*引用类型*/ = // exposition-only
      tuple<difference_type, range_reference_t</*Base*/>>;
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // exposition-only
    difference_type /*位置_*/          = 0;                      // 仅用于说明
    constexpr explicit /*iterator*/(iterator_t</*Base*/> current,
                                    difference_type pos); // 仅用于说明
  public:
    /*iterator*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*iterator*/(/*iterator*/<!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 /*reference-type*/(/*位置_*/, */*current_*/);
    }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*Base*/>
    {
      return /*reference-type*/(/*pos_*/ + n, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*iterator*/& x,
                                     const /*iterator*/& y) noexcept;
    friend constexpr strong_ordering operator<=>(const /*iterator*/& x,
                                                 const /*iterator*/& y) noexcept;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y) noexcept;
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      noexcept(ranges::iter_move(i./*current_*/)) &&
      is_nothrow_move_constructible_v<range_rvalue_reference_t</*Base*/>>)
    {
      return tuple<difference_type, range_rvalue_reference_t</*Base*/>>(
        i./*pos_*/, ranges::iter_move(i./*current_*/));
    }
  };
}

类模板 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>; // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // 仅用于说明
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // 仅用于说明
  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);
  };
}

类模板 std::ranges::zip_view

namespace std::ranges {
  template<class... Rs>
  concept /*zip-is-common*/ = // exposition-only
    (sizeof...(Rs) == 1 && (common_range<Rs> && ...)) ||
    (!(bidirectional_range<Rs> && ...) && (common_range<Rs> && ...)) ||
    ((random_access_range<Rs> && ...) && (sized_range<Rs> && ...));
  template<input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  class zip_view : public view_interface<zip_view<Views...>>
  {
    tuple<Views...> /*views_*/; // exposition-only
    // class template zip_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
    // 类模板 zip_view::sentinel
    template<bool>
    class /*哨兵*/; // exposition-only
  public:
    zip_view() = default;
    constexpr explicit zip_view(Views... views);
    constexpr auto begin()
      requires(!(/*简单视图*/<Views> && ...))
    {
      return /*iterator*/<false>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto begin() const
      requires(range<const Views> && ...)
    {
      return /*iterator*/<true>(/*tuple-transform*/(ranges::begin, /*views_*/));
    }
    constexpr auto end()
      requires(!(/*简单视图*/<Views> && ...))
    {
      if constexpr (!/*zip-is-common*/<Views...>) {
        return /*哨兵*/<false>(/*元组变换*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<Views> && ...)) {
        return begin() + iter_difference_t</*iterator*/<false>>(size());
      } else {
        return /*iterator*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto end() const
      requires(range<const Views> && ...)
    {
      if constexpr (!/*zip-is-common*/<const Views...>) {
        return /*哨兵*/<true>(/*元组变换*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<const Views> && ...)) {
        return begin() + iter_difference_t</*iterator*/<true>>(size());
      } else {
        return /*iterator*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto size()
      requires(sized_range<Views> && ...);
    constexpr auto size() const
      requires(sized_range<const Views> && ...);
  };
  template<class... Rs>
  zip_view(Rs&&...) -> zip_view<views::all_t<Rs>...>;
}

类模板 std::ranges::zip_view::iterator

namespace std::ranges {
  template<input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0)
  template<bool Const>
  class zip_view<Views...>::/*iterator*/
  {
    tuple<iterator_t</*可能为常量*/<Const, Views>>...> /*current_*/; // 仅用于说明
    constexpr explicit /*iterator*/(tuple<iterator_t</*可能为常量*/<Const, Views>>...>);
    // 仅用于说明
  public:
    using iterator_category = input_iterator_tag; // 并非始终存在
    using iterator_concept  = /* 查看描述 */;
    using value_type        = tuple<range_value_t</*可能为常量*/<Const, Views>>...>;
    using difference_type =
      common_type_t<range_difference_t</*可能为常量*/<Const, Views>>...>;
    /*iterator*/() = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const &&
               (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*全向转发*/<Const, Views...>;
    constexpr /*iterator*/& operator--()
      requires /*全双工*/<Const, Views...>;
    constexpr /*iterator*/ operator--(int)
      requires /*all-bidirectional*/<Const, Views...>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires /*全随机访问*/<Const, Views...>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires /*全随机访问*/<Const, Views...>;
    constexpr auto operator[](difference_type n) const
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires(equality_comparable<iterator_t</*可能为常量*/<Const, Views>>> && ...);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires /*全随机访问*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires(sized_sentinel_for<iterator_t</*可能为常量*/<Const, Views>>,
                                  iterator_t</*可能为常量*/<Const, Views>>> &&
               ...);
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      /* 参见描述 */);
    friend constexpr void iter_swap(const /*iterator*/& l,
                                    const /*iterator*/& r) noexcept(/* 查看描述 */)
      requires(indirectly_swappable<iterator_t</*可能为常量*/<Const, Views>>> && ...);
  };
}

类模板 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_*/; // 仅用于说明
    constexpr explicit /*sentinel*/(
      tuple<sentinel_t</*maybe-const*/<Const, Views>>...> end);
    // 仅用于说明
  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);
  };
}

类模板 std::ranges::zip_transform_view

namespace std::范围 {
  template<move_constructible F, input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*可引用*/<invoke_result_t<F&, range_reference_t<Views>...>>
  class zip_transform_view : public view_interface<zip_transform_view<F, Views...>>
  {
    /*movable-box*/<F> /*fun_*/; // 仅用于说明
    zip_view<Views...> /*zip_*/; // 仅用于说明
    using /*内部视图*/ = zip_view<Views...>; // 仅用于说明
    template<bool Const>
    using /*ziperator*/ =
      iterator_t</*可能为常量*/<Const, /*内部视图*/>>; // 仅用于说明
    template<bool Const>
    using /*zentinel*/ =
      sentinel_t</*可能为常量*/<Const, /*内部视图*/>>; // 仅用于说明
    // class template zip_transform_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
    // class template zip_transform_view::sentinel
    template<bool>
    class /*哨兵*/; // 仅用于说明
  public:
    zip_transform_view() = default;
    constexpr explicit zip_transform_view(F fun, Views... views);
    constexpr auto begin() { return /*iterator*/<false>(*this, /*zip_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*内部视图*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      return /*iterator*/<true>(*this, /*zip_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*内部视图*/>) {
        return /*iterator*/<false>(*this, /*zip_*/.end());
      } else {
        return /*哨兵*/<false>(/*zip_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*内部视图*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      if constexpr (common_range<const /*内部视图*/>) {
        return /*iterator*/<true>(*this, /*zip_*/.end());
      } else {
        return /*哨兵*/<true>(/*zip_*/.end());
      }
    }
    constexpr auto size()
      requires sized_range</*内部视图*/>
    {
      return /*zip_*/.size();
    }
    constexpr auto size() const
      requires sized_range<const /*内部视图*/>
    {
      return /*zip_*/.size();
    }
  };
  template<class F, class... Rs>
  zip_transform_view(F, Rs&&...) -> zip_transform_view<F, views::all_t<Rs>...>;
}

类模板 std::ranges::zip_transform_view::iterator

namespace std::ranges {
  template<move_constructible F, input_range... 视图>
    requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
            regular_invocable<F&, range_reference_t<Views>...> &&
            /*可引用*/<invoke_result_t<F&, range_reference_t<Views>...>>
  template<bool Const>
  class zip_transform_view<F, Views...>::/*iterator*/
  {
    using /*Parent*/ = /*可能为常量*/<Const, zip_transform_view>; // exposition-only
    using /*Base*/   = /*可能为常量*/<Const, /*内部视图*/>;      // exposition-only
    /*Parent*/* /*parent_*/ = nullptr;                             // exposition-only
    /*ziperator*/<Const> /*inner_*/;                               // exposition-only
    constexpr /*iterator*/(/*父类*/& parent,
                           /*ziperator*/<Const> inner); // exposition-only
  public:
    using iterator_category = /* 查看描述 */; // 并非始终存在
    using iterator_concept  = typename /*ziperator*/<Const>::iterator_concept;
    using value_type        = remove_cvref_t<
      invoke_result_t</*可能为常量*/<Const, F>&,
                      range_reference_t</*可能为常量*/<Const, Views>>...>>;
    using difference_type = range_difference_t</*Base*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to</*ziperator*/<false>, /*ziperator*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* 查看描述 */);
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable</*ziperator*/<Const>>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for</*ziperator*/<Const>, /*ziperator*/<Const>>;
  };
}

类模板 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_*/;                             // 仅用于说明
    constexpr explicit /*sentinel*/(/*zentinel*/<Const> inner); // 仅用于说明
  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);
  };
}

类模板 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(); // 仅用于说明
    // 类模板 adjacent_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
    // 类模板 adjacent_view::sentinel
    template<bool>
    class /*sentinel*/; // 仅用于说明
    struct /*as-sentinel*/
    {}; // 仅用于说明
  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>;
  };
}

类模板 std::ranges::adjacent_view::iterator

namespace std::ranges {
  template<forward_range V, size_t N>
    requires view<V> && (N > 0)
  template<bool Const>
  class adjacent_view<V, N>::/*iterator*/
  {
    using /*Base*/ = /*可能为常量*/<Const, V>; // exposition-only
    array<iterator_t</*Base*/>, N> /*current_*/ =
      array<iterator_t</*Base*/>, N>(); // exposition-only
    constexpr /*iterator*/(iterator_t</*Base*/> first,
                           sentinel_t</*Base*/> last); // exposition-only
    constexpr /*iterator*/(/*as-sentinel*/,
                           iterator_t</*Base*/> first,
                           iterator_t</*Base*/> last);
    // exposition-only
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 查看描述 */;
    using value_type        = tuple</*REPEAT*/(range_value_t</*Base*/>, N)...>;
    using difference_type   = range_difference_t</*Base*/>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      /* 查看描述 */);
    friend constexpr void iter_swap(const /*iterator*/& l,
                                    const /*iterator*/& r) noexcept(/* 查看描述 */)
      requires indirectly_swappable<iterator_t</*Base*/>>;
  };
}

类模板 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>; // 仅用于说明
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // 仅用于说明
    constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // 仅用于说明
  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);
  };
}

类模板 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)...> &&
             /*可引用*/<
               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_*/;    // exposition-only
    adjacent_view<V, N> /*inner_*/; // 仅用于说明
    using /*内部视图*/ = adjacent_view<V, N>; // 仅用于说明
    template<bool Const>
    using /*内部迭代器*/ =
      iterator_t</*可能为常量*/<Const, /*内部视图*/>>; // exposition-only
    template<bool Const>
    using /*内部哨兵*/ =
      sentinel_t</*可能为常量*/<Const, /*内部视图*/>>; // exposition-only
    // 类模板 adjacent_transform_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
    // 类模板 adjacent_transform_view::sentinel
    template<bool>
    class /*哨兵*/; // 仅用于说明
  public:
    adjacent_transform_view() = default;
    constexpr explicit adjacent_transform_view(V base, F fun);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*inner_*/.base();
    }
    constexpr V base() && { return std::move(/*inner_*/).base(); }
    constexpr auto begin() { return /*iterator*/<false>(*this, /*inner_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*内部视图*/> &&
               regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...>
    {
      return /*iterator*/<true>(*this, /*inner_*/.begin());
    }
    constexpr auto end()
    {
      if constexpr (common_range</*内部视图*/>) {
        return /*iterator*/<false>(*this, /*inner_*/.end());
      } else {
        return /*哨兵*/<false>(/*inner_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*内部视图*/> &&
               regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...>
    {
      if constexpr (common_range<const /*内部视图*/>) {
        return /*iterator*/<true>(*this, /*inner_*/.end());
      } else {
        return /*哨兵*/<true>(/*inner_*/.end());
      }
    }
    constexpr auto size()
      requires sized_range</*内部视图*/>
    {
      return /*inner_*/.size();
    }
    constexpr auto size() const
      requires sized_range<const /*内部视图*/>
    {
      return /*inner_*/.size();
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range</*内部视图*/>
    {
      return /*inner_*/.reserve_hint();
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const /*内部视图*/>
    {
      return /*inner_*/.reserve_hint();
    }
  };
}

类模板 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)...> &&
             /*可引用*/<
               invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>>
  template<bool Const>
  class adjacent_transform_view<V, F, N>::/*iterator*/
  {
    using /*Parent*/ = /*可能为常量*/<Const, adjacent_transform_view>; // 仅用于说明
    using /*Base*/   = /*可能为常量*/<Const, V>;                       // exposition-only
    /*Parent*/* /*parent_*/ = nullptr;                                  // 仅用于说明
    /*内部迭代器*/<Const> /*inner_*/;                               // 仅用于说明
    constexpr /*iterator*/(/*Parent*/& parent,
                           /*内部迭代器*/<Const> inner); // exposition-only
  public:
    using iterator_category = /* 查看描述 */;
    using iterator_concept  = typename /*内部迭代器*/<Const>::iterator_concept;
    using value_type =
      remove_cvref_t<invoke_result_t</*可能为常量*/<Const, F>&,
                                     /*REPEAT*/(range_reference_t</*Base*/>, N)...>>;
    using difference_type = range_difference_t</*Base*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const
               && convertible_to</*内部迭代器*/<false>, /*内部迭代器*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* 查看描述 */);
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> &&
               three_way_comparable</*内部迭代器*/<Const>>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for</*内部迭代器*/<Const>, /*内部迭代器*/<Const>>;
  };
}

类模板 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_*/;                             // 仅用于说明
    constexpr explicit /*sentinel*/(/*inner-sentinel*/<Const> inner); // 仅用于说明
  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);
  };
}

类模板 std::ranges::chunk_view 用于 input_range s

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

类模板 std::ranges::chunk_view::outer_iterator 用于 input_range s

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

类模板 std::ranges::chunk_view::outer_iterator::value_type 用于 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_*/; // 仅用于说明
    constexpr explicit value_type(chunk_view& parent); // 仅用于说明
  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>>;
  };
}

类模板 std::ranges::chunk_view::inner_iterator 用于 input_range 范围

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

类模板 std::ranges::chunk_view 用于 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_*/;                  // 仅用于说明
    range_difference_t<V> /*n_*/; // 仅用于说明
    // 类模板 chunk_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
  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>;
  };
}

类模板 std::ranges::chunk_view::iterator 用于 forward_range s

namespace std::ranges {
  template<view V>
    requires forward_range<V>
  template<bool Const>
  class chunk_view<V>::/*iterator*/
  {
    using /*Parent*/ = /*可能为常量*/<Const, chunk_view>; // exposition-only
    using /*Base*/   = /*可能为常量*/<Const, V>;          // exposition-only
    iterator_t</*Base*/> /*current_*/         = iterator_t</*Base*/>(); // exposition-only
    sentinel_t</*Base*/> /*结束_*/             = sentinel_t</*Base*/>(); // exposition-only
    range_difference_t</*Base*/> /*n_*/       = 0;                      // exposition-only
    range_difference_t</*Base*/> /*缺失_*/ = 0;                      // exposition-only
    constexpr /*iterator*/(/*Parent*/* parent,
                           iterator_t</*Base*/> current, // exposition-only
                           range_difference_t</*Base*/> missing = 0);
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 查看描述 */;
    using value_type = decltype(views::take(subrange(/*current_*/, /*结束_*/), /*n_*/));
    using difference_type = range_difference_t</*Base*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!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 /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

类模板 std::ranges::slide_view

namespace std::ranges {
  template<class V>
  concept /*slide-caches-nothing*/ =
    random_access_range<V> && sized_range<V>; // 仅用于说明
  template<class V>
  concept /*slide-caches-last*/ = // 仅用于说明
    !/*slide-caches-nothing*/<V> && bidirectional_range<V> && common_range<V>;
  template<class V>
  concept /*slide-caches-first*/ = // 仅用于说明
    !/*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_*/;                  // 仅用于说明
    range_difference_t<V> /*n_*/; // 仅用于说明
    // 类模板 slide_view::iterator
    template<bool>
    class /*iterator*/; // 仅用于说明
    // 类 slide_view::sentinel
    class /*sentinel*/; // 仅用于说明
  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>>;
}

类模板 std::ranges::slide_view::iterator

namespace std::ranges {
  template<forward_range V>
    requires view<V>
  template<bool Const>
  class slide_view<V>::/*iterator*/
  {
    using /*Base*/                    = /*可能为常量*/<Const, V>; // exposition-only
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>();    // exposition-only
    iterator_t</*Base*/> /*last-ele_*/ =
      iterator_t</*Base*/>(); // exposition-only
                              // 仅当基础模型采用滑动缓存优先时呈现
    range_difference_t</*Base*/> /*n_*/ = 0; // exposition-only
    constexpr /*iterator*/(iterator_t</*Base*/> current,
                           range_difference_t</*Base*/> n) // exposition-only
      requires(!/*slide-caches-first*/</*Base*/>);
    constexpr /*iterator*/(iterator_t</*Base*/> current,
                           iterator_t</*Base*/> last_ele, // exposition-only
                           range_difference_t</*Base*/> n)
      requires /*slide-caches-first*/</*Base*/>;
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 查看描述 */;
    using value_type        = decltype(views::counted(/*current_*/, /*n_*/));
    using difference_type   = range_difference_t</*Base*/>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>;
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
  };
}

类模板 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>();           // 仅用于说明
    constexpr explicit /*sentinel*/(sentinel_t<V> end); // 仅用于说明
  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>>;
  };
}

类模板 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();               // 仅用于说明
    /*movable-box*/<Pred> /*pred_*/; // 仅用于说明
    // chunk_by_view::iterator 类
    class /*iterator*/; // 仅用于说明
  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>); // 仅用于说明
    constexpr iterator_t<V> /*find-prev*/(iterator_t<V>)  // 仅用于说明
      requires bidirectional_range<V>;
  };
  template<class R, class Pred>
  chunk_by_view(R&&, Pred) -> chunk_by_view<views::all_t<R>, Pred>;
}

类模板 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;         // 仅用于说明
    iterator_t<V> /*current_*/ = iterator_t<V>(); // 仅用于说明
    iterator_t<V> /*next_*/    = iterator_t<V>(); // 仅用于说明
    constexpr /*iterator*/(chunk_by_view& parent,
                           iterator_t<V> current, // 仅用于说明
                           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  = /* 见描述 */;
    /*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);
  };
}

类模板 std::ranges::stride_view

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

类模板 std::ranges::stride_view::iterator

namespace std::ranges {
  template<input_range V>
    requires view<V>
  template<bool Const>
  class stride_view<V>::/*iterator*/
  {
    using /*父类*/ = /*可能为常量*/<Const, stride_view>; // exposition-only
    using /*Base*/   = /*可能为常量*/<Const, V>;           // 仅用于说明
    iterator_t</*Base*/> /*current_*/         = iterator_t</*Base*/>(); // exposition-only
    sentinel_t</*Base*/> /*end_*/             = sentinel_t</*Base*/>(); // 仅用于说明
    range_difference_t</*Base*/> /*stride_*/  = 0;                      // exposition-only
    range_difference_t</*Base*/> /*缺失_*/ = 0;                      // exposition-only
    constexpr /*iterator*/(/*Parent*/* parent,
                           iterator_t</*Base*/> current, // 仅用于说明
                           range_difference_t</*Base*/> missing = 0);
  public:
    using difference_type   = range_difference_t</*Base*/>;
    using value_type        = range_value_t</*Base*/>;
    using iterator_concept  = /* 查看描述 */;
    using iterator_category = /* 参见描述 */; // 并非始终存在
    /*iterator*/()
      requires default_initializable<iterator_t</*Base*/>>
    = default;
    constexpr /*iterator*/(/*iterator*/<!Const> other)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    constexpr iterator_t</*Base*/> base() &&;
    constexpr const iterator_t</*Base*/>& base() const& noexcept;
    constexpr decltype(auto) operator*() const { return */*current_*/; }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*Base*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*Base*/>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& 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 /*iterator*/& x, default_sentinel_t);
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*Base*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*Base*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& x)
      requires random_access_range</*Base*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type n)
      requires random_access_range</*Base*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& 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 /*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*/>>;
  };
}

类模板 std::ranges::cartesian_product_view

namespace std::范围 {
  template<bool Const, class First, class... Vs>
  concept /*笛卡尔积支持随机访问*/ = // 仅用于说明
    (random_access_range</*可能为常量*/<Const, First>> && ... &&
     (random_access_range</*可能为常量*/<Const, Vs>> &&
      sized_range</*可能为常量*/<Const, Vs>>));
  template<class R>
  concept /*笛卡尔积公共参数*/ = // exposition-only
    common_range<R> || (sized_range<R> && random_access_range<R>);
  template<bool Const, class First, class... Vs>
  concept /*笛卡尔积是双向的*/ = // 仅用于说明
    (bidirectional_range</*可能为常量*/<Const, First>> && ... &&
     (bidirectional_range</*可能为常量*/<Const, Vs>> &&
      /*笛卡尔积公共参数*/</*可能为常量*/<Const, Vs>>));
  template<class First, class...>
  concept /*笛卡尔积是常见的*/ = // 仅用于说明
    /*笛卡尔积公共参数*/<First>;
  template<class... Vs>
  concept /*笛卡尔积具有确定大小*/ = // 仅用于说明
    (sized_range<Vs> && ...);
  template<bool Const, template<class> class FirstSent, class First, class... Vs>
  concept /*笛卡尔积大小哨兵*/ = // 仅用于说明
    (sized_sentinel_for<FirstSent</*可能为常量*/<Const, First>>,
                        iterator_t</*可能为常量*/<Const, First>>> &&
     ... &&
     (sized_range</*可能为常量*/<Const, Vs>> &&
      sized_sentinel_for<iterator_t</*可能为常量*/<Const, Vs>>,
                         iterator_t</*可能为常量*/<Const, Vs>>>));
  template</*笛卡尔积公共参数*/ R>
  constexpr auto /*cartesian-common-arg-end*/(R& r)
  { // 仅用于说明
    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_*/; // 仅用于说明
    // 类模板 cartesian_product_view::iterator
    template<bool Const>
    class /*iterator*/; // 仅用于说明
  public:
    constexpr cartesian_product_view() = default;
    constexpr explicit cartesian_product_view(First first_base, Vs... bases);
    constexpr /*iterator*/<false> begin()
      requires(!/*简单视图*/<First> || ... || !/*简单视图*/<Vs>);
    constexpr /*iterator*/<true> begin() const
      requires(range<const First> && ... && range<const Vs>);
    constexpr /*iterator*/<false> end()
      requires((!/*简单视图*/<First> || ... || !/*简单视图*/<Vs>) &&
               /*笛卡尔积是常见的*/<First, Vs...>);
    constexpr /*iterator*/<true> end() const
      requires /*笛卡尔积是常见的*/<const First, const Vs...>;
    constexpr default_sentinel_t end() const noexcept;
    constexpr /* 参见描述 */ size()
      requires /*笛卡尔积具有确定大小*/<First, Vs...>;
    constexpr /* 查看描述 */ size() const
      requires /*笛卡尔积具有确定大小*/<const First, const Vs...>;
  };
  template<class... Vs>
  cartesian_product_view(Vs&&...) -> cartesian_product_view<views::all_t<Vs>...>;
}

类模板 std::ranges::cartesian_product_view::iterator

namespace std::ranges {
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  template<bool Const>
  class cartesian_product_view<First, Vs...>::/*iterator*/
  {
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 参见描述 */;
    using value_type        = tuple<range_value_t</*可能为常量*/<Const, First>>,
                             range_value_t</*可能为常量*/<Const, Vs>>...>;
    using reference         = tuple<range_reference_t</*可能为常量*/<Const, First>>,
                            range_reference_t</*可能为常量*/<Const, Vs>>...>;
    using difference_type   = /* 查看描述 */;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && (convertible_to<iterator_t<First>, iterator_t<const First>> &&
                         ... && convertible_to<iterator_t<Vs>, iterator_t<const Vs>>);
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*可能为常量*/<Const, First>>;
    constexpr /*iterator*/& operator--()
      requires /*笛卡尔积是双向的*/<Const, First, Vs...>;
    constexpr /*iterator*/ operator--(int)
      requires /*笛卡尔积是双向的*/<Const, First, Vs...>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires /*笛卡尔积具有随机访问特性*/<Const, First, Vs...>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires /*笛卡尔积具有随机访问特性*/<Const, First, Vs...>;
    constexpr reference operator[](difference_type n) const
      requires /*笛卡尔积具有随机访问特性*/<Const, First, Vs...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*可能为常量*/<Const, First>>>;
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*全随机访问*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires /*笛卡尔积具有随机访问特性*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires /*笛卡尔积具有随机访问特性*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires /*笛卡尔积具有随机访问特性*/<Const, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires /*笛卡尔积大小哨兵*/<Const, iterator_t, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterator*/& i, default_sentinel_t)
      requires /*笛卡尔积大小哨兵*/<Const, sentinel_t, First, Vs...>;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterator*/& i)
      requires /*笛卡尔积大小哨兵*/<Const, sentinel_t, First, Vs...>;
    friend constexpr auto iter_move(const /*iterator*/& i) noexcept(
      /* 查看描述 */);
    friend constexpr void iter_swap(const /*iterator*/& l,
                                    const /*iterator*/& r) noexcept(/* 查看描述 */)
      requires(indirectly_swappable<iterator_t</*可能为常量*/<Const, First>>> && ... &&
               indirectly_swappable<iterator_t</*可能为常量*/<Const, Vs>>>);
  private:
    using /*Parent*/ = /*可能为常量*/<Const, cartesian_product_view>; // 仅用于说明
    /*Parent*/* /*父级_*/ = nullptr;                                 // 仅用于说明
    tuple<iterator_t</*可能为常量*/<Const, First>>,
          iterator_t</*可能为常量*/<Const, Vs>>...>
      /*current_*/; // 仅用于说明
    template<size_t N = sizeof...(Vs)>
    constexpr void /*下一个*/(); // 仅用于说明
    template<size_t N = sizeof...(Vs)>
    constexpr void /*prev*/(); // 仅用于说明
    template<class Tuple>
    constexpr difference_type /*distance-from*/(const Tuple& t) const; // 仅用于说明
    constexpr /*iterator*/(
      /*Parent*/& parent,
      tuple<iterator_t</*可能为常量*/<Const, First>>,
            iterator_t</*可能为常量*/<Const, Vs>>...> current); // 仅用于说明
  };
}

类模板 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(); // 仅用于说明
    using /*cache-t*/ =
      conditional_t<is_reference_v<range_reference_t<V>>, // 仅用于说明
                    add_pointer_t<range_reference_t<V>>,
                    range_reference_t<V>>;
    /*non-propagating-cache*/</*cache-t*/> /*cache_*/; // 仅用于说明
    // cache_latest_view::iterator 类
    class /*iterator*/; // 仅用于说明
    // cache_latest_view::sentinel 类
    class /*sentinel*/; // 仅用于说明
  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>>;
}

类模板 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_*/; // 仅用于说明
    iterator_t<V> /*current_*/;     // 仅用于说明
    constexpr explicit /*iterator*/(cache_latest_view& parent); // 仅用于说明
  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>>;
  };
}

类模板 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>(); // 仅用于说明
    constexpr explicit /*sentinel*/(cache_latest_view& parent); // 仅用于说明
  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>>;
  };
}

类模板 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(); // 仅用于说明
    // 类模板 to_input_view::iterator
    template<bool Const>
    class /*iterator*/; // 仅用于说明
  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>>;
}

类模板 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>; // 仅用于说明
    iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // 仅用于说明
    constexpr explicit /*iterator*/(iterator_t</*Base*/> current); // 仅用于说明
  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*/>>;
  };
}

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 发布行为 正确行为
LWG 3914 C++23 在概要说明中 std::ranges::enumerate_view
的约束条件被错误指定
已修正