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 의 약칭으로 제공됩니다.

Includes

(C++20)
3-way 비교 연산자 지원
std::initializer_list 클래스 템플릿
범위 반복자

Concepts

Range 개념
네임스페이스 std::ranges 에 정의됨
해당 타입이 범위(range)임을 명시합니다. 즉, begin 반복자(iterator)와 end 센티넬(sentinel)을 제공함
(concept)
해당 타입이 range 임을 명시하고, 이로부터 얻은 반복자들이 댕글링(dangling)의 위험 없이 안전하게 반환될 수 있음을 지정함
(concept)
범위가 상수 시간에 크기를 추정할 수 있음을 명시
(concept)
범위가 자신의 크기를 상수 시간에 알 수 있음을 명시
(concept)
범위가 뷰임을 지정합니다. 즉, 상수 시간 복사/이동/할당을 가짐
(concept)
반복자 타입이 input_iterator 를 만족하는 범위를 지정함
(컨셉)
반복자 타입이 output_iterator 를 만족하는 범위를 명시함
(컨셉)
순방향 반복자를 만족하는 반복자 타입을 가진 범위를 명시합니다 forward_iterator
(컨셉)
양방향 반복자를 만족하는 반복자 타입을 가진 범위를 지정합니다 bidirectional_iterator
(컨셉)
반복자 타입이 random_access_iterator 를 만족하는 범위를 명시함
(컨셉)
반복자 타입이 contiguous_iterator 를 만족하는 범위를 명시함
(컨셉)
범위가 동일한 반복자와 센티넬 타입을 가짐을 명시
(컨셉)
range view 로 안전하게 변환될 수 있는 요구 사항을 명시함
(concept)
범위가 읽기 전용 요소를 가짐을 명시
(concept)

함수

범위 변환
네임스페이스 std::ranges 에 정의됨
(C++23)
입력 범위로부터 새로운 비-뷰 객체를 생성합니다
(함수 템플릿)

클래스

범위 기본 요소
네임스페이스 std::ranges 에 정의됨
범위의 반복자 및 센티널 타입을 얻음
(별칭 템플릿)
범위의 크기, 차이 및 값 타입을 얻음
(별칭 템플릿)
범위의 참조 타입을 획득함
(별칭 템플릿)
네임스페이스 std::ranges 에 정의됨
view 를 정의하기 위한 도우미 클래스 템플릿, curiously recurring template pattern 사용
(클래스 템플릿)
반복자-센티널 쌍을 하나의 view 로 결합합니다
(클래스 템플릿)
댕글링 반복자 처리
네임스페이스 std::ranges 에 정의됨
댕글링 상태를 피하기 위해 반환되어서는 안 되는 반복자나 subrange 를 나타내는 플레이스홀더 타입
(클래스)
borrowed_range 의 반복자 타입 또는 subrange 타입을 획득함
(alias template)
기타 유틸리티
네임스페이스 std::ranges 에 정의됨
범위를 단일 값이 아닌 시퀀스로 처리하도록 태그 지정
(클래스 템플릿)
팩토리
네임스페이스 std::ranges 에 정의됨
요소가 없는 빈 view
(클래스 템플릿) (변수 템플릿)
지정된 값을 가지는 단일 요소를 포함하는 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
초기값을 반복적으로 증가시켜 생성된 시퀀스로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
동일한 값을 반복적으로 생성하여 만들어진 시퀀스로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
연관된 입력 스트림에 대해 operator>> 를 연속적으로 적용하여 얻은 요소들로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
어댑터
네임스페이스 std::ranges 에 정의됨
범위 어댑터 클로저 객체를 정의하기 위한 헬퍼 베이스 클래스 템플릿
(클래스 템플릿)
range 의 모든 요소를 포함하는 view
(alias template) (range adaptor object)
다른 range 의 원소들을 참조하는 view
(클래스 템플릿)
어떤 view 를 단독 소유하는 range
(클래스 템플릿)
각 요소를 rvalue로 캐스팅하는 시퀀스의 view
(클래스 템플릿) (레인지 어댑터 객체)
view 의 요소들 중 range 의 술어(predicate)를 만족하는 요소들로 구성된 뷰
(클래스 템플릿) (범위 어댑터 객체)
각 요소에 변환 함수를 적용하는 시퀀스의 view
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 첫 N개 요소로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 초기 요소들로 구성된 view 로, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성된 view 로, 처음 N개의 요소를 건너뜁니다
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성되며, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뛴 view
(클래스 템플릿) (범위 어댑터 객체)
view 의 시퀀스를 평면화하여 얻은 시퀀스로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)
범위의 뷰를 평탄화하여 얻은 시퀀스로 구성된 view 이며, 요소 사이에 구분자가 있음
(클래스 템플릿) (범위 어댑터 객체)
다른 view 를 구분자로 분할하여 얻은 하위 범위에 대한 view
(클래스 템플릿) (범위 어댑터 객체)
다른 view 를 구분자를 사용하여 분할하여 얻은 하위 범위들에 대한 view
(클래스 템플릿) (범위 어댑터 객체)
적응된 뷰들의 연결로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
반복자와 개수로부터 서브레인지를 생성합니다
(커스터마이제이션 포인트 객체)
view common_range 로 변환합니다
(클래스 템플릿) (레인지 어댑터 객체)
다른 양방향 view 의 요소들을 역순으로 순회하는 view
(클래스 템플릿) (레인지 어댑터 객체)
view constant_range 로 변환합니다
(클래스 템플릿) (레인지 어댑터 객체)
view 로 구성된 범위를 취하고 숫자 N을 받아 각 튜플의 N th 요소로 구성된 view 를 생성함
(클래스 템플릿) (범위 어댑터 객체)
pair-like 값들로 구성된 view 를 취하여 각 pair의 첫 번째 요소들로 이루어진 view 를 생성함
(클래스 템플릿) (range adaptor 객체)
pair-like 값들로 구성된 view 를 취하고 각 pair의 두 번째 요소들로 이루어진 view 를 생성함
(클래스 템플릿) (범위 어댑터 객체)
적응된 시퀀스의 각 요소를 요소의 위치와 값 모두를 포함하는 튜플로 매핑하는 view
(클래스 템플릿) (레인지 어댑터 객체)
적응된 뷰들의 해당 요소들에 대한 참조의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
적응된 뷰들의 대응되는 요소들에 변환 함수를 적용한 결과로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
적응된 view 의 인접한 요소들에 대한 참조 튜플로 구성된 뷰
(클래스 템플릿) (레인지 어댑터 객체)
적응된 뷰의 인접한 요소들에 변환 함수를 적용한 결과로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 요소들을 N 크기의 겹치지 않는 연속적인 청크로 나타내는 view 들의 범위
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 M th 번째부터 (M + N - 1) th 번째 요소들에 대한 view 인 M th 번째 요소를 가진 view
(클래스 템플릿) (레인지 어댑터 객체)
주어진 조건자가 false 를 반환하는 인접한 요소 쌍 사이에서 view 를 부분 범위로 분할합니다
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성된 view 로, 한 번에 N개 요소씩 건너뛰며 진행
(클래스 템플릿) (범위 어댑터 객체)
적응된 뷰들의 n-ary 카테시안 곱으로 계산된 결과의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
기본 시퀀스의 마지막으로 접근된 요소를 캐시하는 view
(클래스 템플릿) (레인지 어댑터 객체)
view input_range 전용이면서 비- common_range 범위로 변환합니다
(클래스 템플릿) (범위 어댑터 객체)

커스터마이제이션 포인트 객체

범위 접근
네임스페이스 std::ranges 에 정의됨
범위의 시작 부분을 가리키는 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
범위의 끝을 나타내는 센티널을 반환합니다
(커스터마이제이션 포인트 객체)
읽기 전용 범위의 시작 부분을 가리키는 반복자를 반환함
(커스터마이제이션 포인트 객체)
읽기 전용 범위의 끝을 나타내는 sentinel을 반환합니다
(customization point object)
범위에 대한 역방향 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
범위의 역방향 끝 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
읽기 전용 범위에 대한 역방향 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
읽기 전용 범위의 역방향 끝 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
범위가 제공하는 예약 힌트와 동일한 정수를 반환함
(커스터마이제이션 포인트 객체)
범위의 크기와 동일한 정수를 반환합니다
(커스터마이제이션 포인트 객체)
범위의 크기와 동일한 부호 있는 정수를 반환합니다
(커스터마이제이션 포인트 객체)
범위가 비어 있는지 확인
(커스터마이제이션 포인트 객체)
연속 범위의 시작 부분에 대한 포인터를 획득합니다
(커스터마이제이션 포인트 객체)
읽기 전용 연속 범위의 시작 부분에 대한 포인터를 획득합니다
(커스터마이제이션 포인트 객체)

열거형

네임스페이스 std::ranges 에 정의됨
std::ranges::subrange std::ranges::sized_range 를 모델링하는지 여부를 지정함
(열거형)

헬퍼스

std::ranges::subrange 의 크기를 구함
(클래스 템플릿 특수화)
std::ranges::subrange 의 반복자 또는 센티널 타입을 얻음
(클래스 템플릿 특수화)
std::ranges::subrange 에서 반복자 또는 센티널을 획득합니다
(함수 템플릿)
from-range 생성 태그
(태그)

시놉시스

// 대부분 독립 실행형
#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        = /* 미지정 */;
  }
  // ranges
  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 /*maybe-const*/ = conditional_t<Const, const T, T>; // exposition-only
  // 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 view
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
    requires                /* 설명 참조 */
  class basic_istream_view; // 호스팅됨
  template<class Val>
  using istream_view = basic_istream_view<Val, char>; // 호스팅됨
  template<class Val>
  using wistream_view = basic_istream_view<Val, wchar_t>; // 호스팅됨
  namespace views {
    template<class T>
    constexpr /* 지정되지 않음 */ istream = /* 지정되지 않음 */; // 호스팅됨
  }
  // 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;
  // owning view
  template<range R>
    requires /* 설명 참조 */
  class owning_view;
  template<class T>
  constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>;
  // rvalue 뷰로서
  template<view V>
    requires input_range<V>
  class as_rvalue_view;
  template<class T>
  constexpr bool enable_borrowed_range<as_rvalue_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* 지정되지 않음 */ 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 = /* 지정되지 않음 */;
  }
  // join with view
  template<input_range V, forward_range Pattern>
    requires /* 설명 참조 */
  class join_with_view;
  namespace views {
    inline constexpr /* 지정되지 않음 */ join_with = /* 미지정 */;
  }
  // lazy split view
  template<class R>
  concept /*tiny-range*/ = /* 설명 참조 */; // exposition-only
  template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
             indirectly_comparable<iterator_t<V>,
                                   iterator_t<Pattern>,
                                   ranges::equal_to> &&
             (forward_range<V> || /*tiny-range*/<Pattern>)
  class lazy_split_view;
  // 분할 뷰
  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      = /* 미지정 */;
  }
  // concat view
  template<input_range... >
    requires /* 설명 참조 */
  class concat_view;
  namespace views {
    inline constexpr /* 미지정 */ concat = /* 미지정 */;
  }
  // counted view
  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 = /* 지정되지 않음 */;
  }
  // const 뷰로서
  template<input_range R>
  constexpr auto& /*possibly-const-range*/(R& r) noexcept
  { // exposition-only
    if constexpr (input_range<const R>) {
      return const_cast<const R&>(r);
    } else {
      return r;
    }
  }
  template<view V>
    requires input_range<V>
  class as_const_view;
  template<class T>
  constexpr bool enable_borrowed_range<as_const_view<T>> = enable_borrowed_range<T>;
  namespace views {
    inline constexpr /* 미지정 */ 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 view
  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 transform view
  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 = /* 지정되지 않음 */;
  }
  // adjacent view
  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
(설명: HTML 태그와 속성은 번역하지 않고 그대로 유지되었으며, C++ 관련 용어인 "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
(설명: HTML 태그와 속성은 번역하지 않고 그대로 유지되었으며, C++ 관련 용어인 "ranges::subrange_kind"는 번역되지 않았습니다. 원본 형식이 완전히 보존되었습니다.) K>
  struct tuple_element<0, ranges::subrange<I, S, K>>
  {
    using type = I;
  };
  template<class I, class S, ranges::subrange_kind
(설명: HTML 태그와 속성은 번역하지 않고 그대로 유지되었으며, C++ 관련 용어인 "ranges::subrange_kind"는 번역되지 않았습니다. 링크 구조와 클래스 속성도 원본 형식을 그대로 보존했습니다.) K>
  struct tuple_element<1, ranges::subrange<I, S, K>>
  {
    using type = S;
  };
  template<class I, class S, ranges::subrange_kind
(설명: HTML 태그와 속성은 번역하지 않고 그대로 유지되었으며, C++ 관련 용어인 "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
    { // exposition-only
      return static_cast<D&>(*this);
    }
    constexpr const D& /*파생된*/() const noexcept
    { // exposition-only
      return static_cast<const D&>(*this);
    }
  public:
    constexpr bool empty()
      requires sized_range<D> || forward_range<D>
    {
      if constexpr (sized_range<D>)
        return ranges::size(/*파생된*/()) == 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 /*슬라이싱되지 않는 변환 가능*/ = // exposition-only
    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::크기 지정된 : subrange_kind::unsized>
    requires(K == subrange_kind::sized || !sized_sentinel_for<S, I>)
  class subrange : public view_interface<subrange<I, S, K>>
  {
  private:
    static constexpr bool /*StoreSize*/ = // exposition-only
      K == subrange_kind::sized && !sized_sentinel_for<S, I>;
    I /*begin_*/ = I(); // exposition-only
    S /*end_*/   = S(); // exposition-only
    /*make-unsigned-like-t*/<iter_difference_t<I>> /*size_*/ =
      0; // 설명 목적으로만 존재함
         // 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::크기 지정된>;
}

클래스 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*/ = /* see description */; // 설명 전용
  template<class I>
  concept /*advanceable*/ = /* see description */; // 설명 전용
  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, /* see description */ last);
    constexpr /*iterator*/ begin() const;
    constexpr auto end() const;
    constexpr /*iterator*/ end() const
      requires same_as<W, Bound>;
    constexpr bool empty() const;
    constexpr auto size() const
      requires /* see description */;
  };
  template<class W, class Bound>
    requires(!/*is-integer-like*/<W> || !/*is-integer-like*/<Bound> ||
             (/*is-signed-integer-like*/<W> == /*is-signed-integer-like*/<Bound>))
  iota_view(W, Bound) -> iota_view<W, Bound>;
}

클래스 템플릿 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 /*정수-형식-사용가능-차이-타입*/ = // 설명 전용
    /*부호있는-정수-형식*/<T> || (/*정수-형식*/<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>> &&
             (/*정수-형식-사용가능-차이-타입*/<Bound> ||
              same_as<Bound, unreachable_sentinel_t>))
  class repeat_view : public view_interface<repeat_view<T, Bound>>
  {
  private:
    // 클래스 repeat_view::iterator
    struct /*iterator*/; // 설명 전용
    /*이동가능-박스*/<T> /*값_*/; // 설명 전용
    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>> &&
             (/*정수-유형-차이-타입-사용-가능*/<Bound> ||
              same_as<Bound, unreachable_sentinel_t>))
  class repeat_view<T, Bound>::/*반복자*/
  {
  private:
    using /*인덱스-타입*/ = // 설명-전용
      conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>;
    const T* /*value_*/         = nullptr;          // 설명-전용
    /*인덱스-타입*/ /*current_*/ = /*인덱스-타입*/(); // 설명-전용
    constexpr explicit /*반복자*/(
      const T* value,
      /*인덱스-타입*/ b = /*인덱스-타입*/()); // 설명-전용
  public:
    using iterator_concept  = random_access_iterator_tag;
    using iterator_category = random_access_iterator_tag;
    using value_type        = T;
    using difference_type   = /* 설명 참조 */;
    /*반복자*/()          = default;
    constexpr const T& operator*() const noexcept;
    constexpr /*반복자*/& operator++();
    constexpr /*반복자*/ operator++(int);
    constexpr /*반복자*/& operator--();
    constexpr /*반복자*/ operator--(int);
    constexpr /*반복자*/& operator+=(difference_type n);
    constexpr /*반복자*/& operator-=(difference_type n);
    constexpr const T& operator[](difference_type n) const noexcept;
    friend constexpr bool operator==(const /*반복자*/& x, const /*반복자*/& y);
    friend constexpr auto operator<=>(const /*반복자*/& x, const /*반복자*/& y);
    friend constexpr /*반복자*/ operator+(/*반복자*/ i, difference_type n);
    friend constexpr /*반복자*/ operator+(difference_type n, /*반복자*/ i);
    friend constexpr /*반복자*/ operator-(/*반복자*/ i, difference_type n);
    friend constexpr difference_type operator-(const /*반복자*/& x,
                                               const /*반복자*/& 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*/ = /*maybe-const*/<Const, transform_view>;  // exposition-only
    using /*기본*/   = /*maybe-const*/<Const, V>;               // exposition-only
    iterator_t</*기본*/> /*current_*/ = iterator_t</*기본*/>(); // exposition-only
    /*Parent*/* /*부모_*/           = nullptr;                // exposition-only
  public:
    using iterator_concept  = /* 설명 참조 */;
    using iterator_category = /* 설명 참조 */; // 항상 존재하는 것은 아님
    using value_type        = remove_cvref_t<
      invoke_result_t</*maybe-const*/<Const, F>&, range_reference_t</*기본*/>>>;
    using difference_type = range_difference_t</*기본*/>;
    /*iterator*/()
      requires default_initializable<iterator_t</*기본*/>>
    = default;
    constexpr /*iterator*/(/*Parent*/& parent, iterator_t</*기본*/> current);
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>>;
    constexpr const iterator_t</*기본*/>& base() const& noexcept;
    constexpr iterator_t</*기본*/> 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</*기본*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires random_access_range</*기본*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*기본*/>
    {
      return invoke(*/*부모_*/->/*fun_*/, /*current_*/[n]);
    }
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*기본*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/> && three_way_comparable<iterator_t</*기본*/>>
    ;
    friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*기본*/>, iterator_t</*기본*/>>;
  };
}

클래스 템플릿 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>> &&
             /*참조-가능*/<invoke_result_t<F&, range_reference_t<V>>>
  template<bool Const>
  class transform_view<V, F>::/*센티널*/
  {
  private:
    using /*부모*/ = /*상수-가능*/<Const, transform_view>; // 설명 전용
    using /*기반*/   = /*상수-가능*/<Const, V>;              // 설명 전용
    sentinel_t</*기반*/> /*끝_*/ = sentinel_t</*기반*/>();    // 설명 전용
  public:
    /*센티널*/() = default;
    constexpr explicit /*센티널*/(sentinel_t</*기반*/>);
    constexpr /*센티널*/(/*센티널*/<!Const> i)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*기반*/>>;
    constexpr sentinel_t</*기반*/> base() const;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*기반*/>,
                            iterator_t</*상수-가능*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*반복자*/<OtherConst>& x,
                                     const /*센티널*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*기반*/>,
                                  iterator_t</*상수-가능*/<OtherConst, V>>>
    friend constexpr range_difference_t</*상수-가능*/<OtherConst, V>> operator-(
      const /*반복자*/<OtherConst>& x,
      const /*센티널*/& y);
    template<bool OtherConst>
      requires sized_sentinel_for<sentinel_t</*기반*/>,
                                  iterator_t</*상수-가능*/<OtherConst, V>>>
    friend constexpr range_difference_t</*상수-가능*/<OtherConst, V>> operator-(
      const /*센티널*/& y,
      const /*반복자*/<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
    // class template take_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    take_view()
      requires default_initializable<V>
    = default;
    constexpr explicit take_view(V base, range_difference_t<V> count);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*단순 보기*/<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 /*sentinel*/<false>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto end() const
      requires range<const V>
    {
      if constexpr (sized_range<const V>) {
        if constexpr (random_access_range<const V>)
          return ranges::begin(/*base_*/) + range_difference_t<const V>(size());
        else
          return default_sentinel;
      } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
        return default_sentinel;
      } else {
        return /*sentinel*/<true>{ ranges::end(/*base_*/) };
      }
    }
    constexpr auto size()
      requires sized_range<V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*count_*/));
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      auto n = ranges::size(/*base_*/);
      return ranges::min(n, static_cast<decltype(n)>(/*count_*/));
    }
    constexpr auto reserve_hint()
    {
      if constexpr (approximately_sized_range<V>) {
        auto n = static_cast<range_difference_t<V>>(ranges::reserve_hint(/*base_*/));
        return /*to-unsigned-like*/(ranges::min(n, /*count_*/));
      }
      return /*to-unsigned-like*/(/*count_*/);
    }
    constexpr auto reserve_hint() const
    {
      if constexpr (approximately_sized_range<const V>) {
        auto n =
          static_cast<range_difference_t<const V>>(ranges::reserve_hint(/*base_*/));
        return /*to-unsigned-like*/(ranges::min(n, /*count_*/));
      }
      return /*to-unsigned-like*/(/*count_*/);
    }
  };
  template<class R>
  take_view(R&&, range_difference_t<R>) -> take_view<views::all_t<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::ranges {
  template<input_range V>
    requires view<V> && input_range<range_reference_t<V>>
  class join_view : public view_interface<join_view<V>>
  {
  private:
    using /*InnerRng*/ = range_reference_t<V>; // exposition-only
    // class template join_view::iterator
    template<bool Const>
    struct /*iterator*/; // exposition-only
    // class template join_view::sentinel
    template<bool Const>
    struct /*sentinel*/; // exposition-only
    V /*base_*/ = V(); // exposition-only
    /*비전파 캐시*/<iterator_t<V>> /*outer_*/; // 설명 목적으로만 존재함
                                                         // when !forward_range<V>
    /*비전파 캐시*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/; // 설명 목적으로만 존재함
                  // if is_reference_v<InnerRng> is false
  public:
    join_view()
      requires default_initializable<V>
    = default;
    constexpr explicit join_view(V base);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        constexpr bool use_const = /*간단한 보기*/<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 /*sentinel*/</*간단한 보기*/<V>>{ *this };
    }
    constexpr auto end() const
      requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>>
    {
      if constexpr (forward_range<range_reference_t<const V>> && common_range<const V> &&
                    common_range<range_reference_t<const V>>)
        return /*iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/<true>{ *this };
    }
  };
  template<class R>
  explicit join_view(R&&) -> join_view<views::all_t<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*/    = /*maybe-const*/<Const, join_view>;       // exposition-only
    using /*기본*/      = /*maybe-const*/<Const, V>;               // exposition-only
    using /*OuterIter*/ = iterator_t</*기본*/>;                    // exposition-only
    using /*InnerIter*/ = iterator_t<range_reference_t</*기본*/>>; // exposition-only
    static constexpr bool /*ref-is-glvalue*/ = // exposition-only
      is_reference_v<range_reference_t</*기본*/>>;
    /*OuterIter*/ /*outer_*/ = /*OuterIter*/(); // 설명 목적으로만 존재함
                                                // Base가 forward_range를 모델링하는 경우
    optional</*InnerIter*/> /*inner_*/;         // exposition-only
    /*Parent*/* /*부모_*/ = nullptr;          // exposition-only
    constexpr void /*satisfy*/(); // exposition-only
    constexpr /*OuterIter*/& /*outer*/();             // exposition-only
    constexpr const /*OuterIter*/& /*outer*/() const; // exposition-only
    constexpr /*iterator*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*기본*/>; // exposition-only
    constexpr explicit /*iterator*/(/*Parent*/& parent)
      requires(!forward_range</*기본*/>); // exposition-only
  public:
    using iterator_concept  = /* 설명 참조 */;
    using iterator_category = /* 설명 참조 */; // 항상 존재하지는 않음
    using value_type        = range_value_t<range_reference_t</*기본*/>>;
    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 /*InnerIter*/ operator->() const
      requires /*화살표 있음*/</*InnerIter*/> && copyable</*InnerIter*/>;
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires /*ref-is-glvalue*/
               && forward_range</*기본*/> && forward_range<range_reference_t</*기본*/>>;
    constexpr /*iterator*/& operator--()
      requires /*ref-is-glvalue*/ && bidirectional_range</*기본*/> &&
               bidirectional_range<range_reference_t</*기본*/>> &&
               common_range<range_reference_t</*기본*/>>;
    constexpr /*iterator*/ operator--(int)
      requires /*ref-is-glvalue*/ && bidirectional_range</*기본*/> &&
               bidirectional_range<range_reference_t</*기본*/>> &&
               common_range<range_reference_t</*기본*/>>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires /*ref-is-glvalue*/ && forward_range</*기본*/> &&
               equality_comparable<iterator_t<range_reference_t</*기본*/>>>;
    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
(HTML 태그와 속성은 번역하지 않고 원본 형식을 유지하며, , 
,  태그 내 텍스트는 번역하지 않으며, C++ 관련 용어는 번역하지 않음)
(*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-common*/ =
    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
    /*비전파 캐시*/<iterator_t<V>> /*outer-it_*/; // 설명 목적으로만 존재
                                                            // only when !forward_range<V>
    /*비전파 캐시*/<remove_cv_t</*InnerRng*/>>
      /*inner_*/;                     // 설명 목적으로만 존재함
                                      // if is_reference_v<InnerRng> is false
    Pattern /*패턴_*/ = Pattern(); // exposition-only
    // class template join_with_view::iterator
    template<bool Const>
    struct /*iterator*/; // exposition-only
    // class template join_with_view::sentinel
    template<bool Const>
    struct /*sentinel*/; // exposition-only
  public:
    join_with_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit join_with_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t<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 {
        /*outer-it_*/ = ranges::begin(/*base_*/);
        return /*iterator*/<false>{ *this };
      }
    }
    constexpr auto begin() const
      requires forward_range<const V> && forward_range<const Pattern> &&
               is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>> &&
               /*연결 가능*/<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 /*sentinel*/ < /*단순 보기*/<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>> &&
               /*concatable*/<range_reference_t<const V>, const Pattern>
    {
      using InnerConstRng = range_reference_t<const V>;
      if constexpr (forward_range<InnerConstRng> && common_range<const V> &&
                    common_range<InnerConstRng>)
        return /*iterator*/<true>{ *this, ranges::end(/*base_*/) };
      else
        return /*sentinel*/<true>{ *this };
    }
  };
  template<class R, class P>
  join_with_view(R&&, P&&) -> join_with_view<views::all_t<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*/      = /*maybe-const*/<Const, join_with_view>; // exposition-only
    using /*기본*/        = /*maybe-const*/<Const, V>;              // exposition-only
    using /*InnerBase*/   = range_reference_t</*기본*/>;            // exposition-only
    using /*PatternBase*/ = /*maybe-const*/<Const, Pattern>;        // exposition-only
    using /*OuterIter*/   = iterator_t</*기본*/>;        // exposition-only
    using /*InnerIter*/   = iterator_t</*InnerBase*/>;   // exposition-only
    using /*PatternIter*/ = iterator_t</*PatternBase*/>; // exposition-only
    static constexpr bool /*ref-is-glvalue*/ =
      is_reference_v</*InnerBase*/>; // exposition-only
    /*Parent*/* /*parent_*/     = nullptr;                 // exposition-only
    /*OuterIter*/ /*outer-it_*/ = /*OuterIter*/();         // 설명 목적으로만 존재함
                                                           // Base가 forward_range를 모델링하는 경우
    variant</*PatternIter*/, /*InnerIter*/> /*inner-it_*/; // exposition-only
    constexpr /*iterator*/(/*Parent*/& parent, /*OuterIter*/ outer)
      requires forward_range</*Base*/>; // exposition-only
    constexpr explicit /*iterator*/(/*Parent*/& parent)
      requires(!forward_range</*기본*/>);             // exposition-only
    constexpr /*OuterIter*/& /*outer*/();             // exposition-only
    constexpr const /*OuterIter*/& /*outer*/() const; // exposition-only
    constexpr auto& /*내부 업데이트*/();               // 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</*기본*/> &&
               /*bidirectional-common*/</*InnerBase*/> &&
               /*bidirectional-common*/</*PatternBase*/>;
    constexpr /*iterator*/ operator--(int)
      requires /*ref-is-glvalue*/ && bidirectional_range</*기본*/> &&
               /*양방향-공통*/</*InnerBase*/> &&
               /*bidirectional-common*/</*PatternBase*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires /*ref-is-glvalue*/
               && forward_range</*기본*/> && equality_comparable</*InnerIter*/>;
    friend constexpr decltype(auto) iter_move(const /*iterator*/& x)
    {
      using rvalue_reference =
        common_reference_t<iter_rvalue_reference_t</*InnerIter*/>,
                           iter_rvalue_reference_t</*PatternIter*/>>;
      return visit<rvalue_reference>(ranges::iter_move, x./*inner-it_*/);
    }
    friend constexpr void iter_swap(const /*iterator*/& x, const /*iterator*/& y)
      requires indirectly_swappable</*InnerIter*/, /*PatternIter*/>
    {
      visit(ranges::iter_swap
(설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 관련 용어인 "ranges::iter_swap"은 번역되지 않았습니다. 원본 형식이 완벽하게 보존되었습니다.), x./*inner-it_*/, 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> &&
             /*concatable*/<range_reference_t<V>, Pattern>
  template<bool Const>
  class join_with_view<V, Pattern>::/*sentinel*/
  {
    using /*Parent*/ = /*maybe-const*/<Const, join_with_view>; // 설명 전용
    using /*Base*/   = /*maybe-const*/<Const, V>;              // 설명 전용
    sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>();    // 설명 전용
    constexpr explicit /*sentinel*/(/*Parent*/& parent); // 설명 전용
  public:
    /*sentinel*/() = default;
    constexpr /*sentinel*/(/*sentinel*/<!Const> s)
      requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>;
    template<bool OtherConst>
      requires sentinel_for<sentinel_t</*Base*/>,
                            iterator_t</*maybe-const*/<OtherConst, V>>>
    friend constexpr bool operator==(const /*iterator*/<OtherConst>& x,
                                     const /*sentinel*/& y);
  };
}

클래스 템플릿 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>가 false인 경우
    // class template lazy_split_view::outer-iterator
    template<bool>
    struct /*외부 반복자*/; // exposition-only
    // class template lazy_split_view::inner-iterator
    template<bool>
    struct /*inner-iterator*/; // exposition-only
  public:
    lazy_split_view()
      requires default_initializable<V> && default_initializable<Pattern>
    = default;
    constexpr explicit lazy_split_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t<R>> &&
               constructible_from<Pattern, single_view<range_value_t<R>>>
    constexpr explicit lazy_split_view(R&& r, range_value_t<R> e);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
    {
      if constexpr (forward_range<V>) {
        return /*외부 반복자*/ < /*간단한 보기*/<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를 모델링할 때만 존재
                              // if V models 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를 모델링할 때만 존재
                                                  // present only if Base
                                                  // models 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를 모델링할 때만 존재
                                                     // 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>::/*iterator*/
  {
  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>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(split_view& parent,
                           iterator_t<V> current,
                           subrange<iterator_t<V>> next);
    constexpr iterator_t<V> base() const;
    constexpr value_type operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
  };
}

클래스 템플릿 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*/</*maybe-const*/<Const, Views>...>;
    using difference_type =
      common_type_t<range_difference_t</*maybe-const*/<Const, Views>>...>;
  private:
    using /*base-iter*/ = // exposition-only
      variant<iterator_t</*maybe-const*/<Const, Views>>...>;
    /*maybe-const*/<Const, concat_view>* /*parent_*/ = nullptr; // exposition-only
    /*base-iter*/ /*it_*/;                                      // exposition-only
    template<size_t N>
    constexpr void /*만족*/(); // exposition-only
    template<size_t N>
    constexpr void /*이전*/(); // exposition-only
    template<size_t N>
    constexpr void /*advance-fwd*/(difference_type offset, // exposition-only
                                   difference_type steps);
    template<size_t N>
    constexpr void /*advance-bwd*/(difference_type offset, // exposition-only
                                   difference_type steps);
    template<class... Args>
    constexpr explicit /*iterator*/(
      /*maybe-const*/<Const, concat_view>* parent, // exposition-only
      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</*maybe-const*/<Const, Views>>> && ...);
    friend constexpr bool operator==(const /*iterator*/& it, default_sentinel_t);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires(/*all-random-access*/<Const, Views...> &&
               (three_way_comparable<iterator_t</*maybe-const*/<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(); // exposition-only
  public:
    common_view()
      requires default_initializable<V>
    = default;
    constexpr explicit common_view(V r);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
    constexpr auto begin()
      requires(!/*간단한 보기*/<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
(설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 관련 용어인 "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 /*has-tuple-element*/ = // 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> && /*has-tuple-element*/<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 /*sentinel*/<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 /*sentinel*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto end() const
      requires common_range<const V>
    {
      return /*iterator*/<true>{ ranges::end(/*base_*/) };
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
  private:
    // class template elements_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // class template elements_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
    V /*base_*/ = V(); // exposition-only
  };
}

클래스 템플릿 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 /*기본*/                    = /*maybe-const*/<Const, V>; // exposition-only
    iterator_t</*기본*/> /*current_*/ = iterator_t</*기본*/>(); // exposition-only
    static constexpr decltype(auto) /*get-element*/(
      const iterator_t</*기본*/>& i); // exposition-only
  public:
    using iterator_concept  = /* 설명 참조 */;
    using iterator_category = /* 설명 참조 */; // 항상 존재하는 것은 아님
    using value_type        = remove_cvref_t<tuple_element_t<N, range_value_t</*기본*/>>>;
    using difference_type   = range_difference_t</*기본*/>;
    /*iterator*/()
      requires default_initializable<iterator_t</*기본*/>>
    = default;
    constexpr explicit /*iterator*/(iterator_t</*기본*/> current);
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>>;
    constexpr const iterator_t</*기본*/>& base() const& noexcept;
    constexpr iterator_t</*기본*/> base() &&;
    constexpr decltype(auto) operator*() const { return /*get-element*/(/*current_*/); }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*기본*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*기본*/>
    {
      return /*get-element*/(/*current_*/ + n);
    }
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*기본*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/> && three_way_comparable<iterator_t</*기본*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*기본*/>, iterator_t</*기본*/>>;
  };
}

클래스 템플릿 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::ranges {
  template<view V>
    requires /*range-with-movable-references*/<V>
  class enumerate_view : public view_interface<enumerate_view<V>>
  {
    V /*base_*/ = V(); // exposition-only
    // class template enumerate_view::iterator
    template<bool Const>
    class /*iterator*/; // exposition-only
    // class template enumerate_view::sentinel
    template<bool Const>
    class /*sentinel*/; // exposition-only
  public:
    constexpr enumerate_view()
      requires default_initializable<V>
    = default;
    constexpr explicit enumerate_view(V base);
    constexpr auto begin()
      requires(!/*간단한 보기*/<V>)
    {
      return /*iterator*/<false>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto begin() const
      requires /*range-with-movable-references*/<const V>
    {
      return /*iterator*/<true>(ranges::begin(/*base_*/), 0);
    }
    constexpr auto end()
      requires(!/*단순 보기*/<V>)
    {
      if constexpr (forward_range<V> && common_range<V> && sized_range<V>)
        return /*iterator*/<false>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*sentinel*/<false>(ranges::end(/*base_*/));
    }
    constexpr auto end() const
      requires /*참조가 이동 가능한 범위*/<const V>
    {
      if constexpr (forward_range<const V> && common_range<const V> &&
                    sized_range<const V>)
        return /*iterator*/<true>(ranges::end(/*base_*/), ranges::distance(/*base_*/));
      else
        return /*sentinel*/<true>(ranges::end(/*base_*/));
    }
    constexpr auto size()
      requires sized_range<V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto size() const
      requires sized_range<const V>
    {
      return ranges::size(/*base_*/);
    }
    constexpr auto reserve_hint()
      requires approximately_sized_range<V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr auto reserve_hint() const
      requires approximately_sized_range<const V>
    {
      return ranges::reserve_hint(/*base_*/);
    }
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*base_*/;
    }
    constexpr V base() && { return std::move(/*base_*/); }
  };
  template<class R>
  enumerate_view(R&&) -> enumerate_view<views::all_t
(설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 관련 용어인 "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 /*기본*/ = /*maybe-const*/<Const, V>; // exposition-only
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 설명 참조 */;
    using difference_type   = range_difference_t</*기본*/>;
    using value_type        = tuple<difference_type, range_value_t</*기본*/>>;
  private:
    using /*참조-타입*/ = // exposition-only
      tuple<difference_type, range_reference_t</*기본*/>>;
    iterator_t</*기본*/> /*current_*/ = iterator_t</*기본*/>(); // exposition-only
    difference_type /*pos_*/          = 0;                      // exposition-only
    constexpr explicit /*iterator*/(iterator_t</*기본*/> current,
                                    difference_type pos); // exposition-only
  public:
    /*iterator*/()
      requires default_initializable<iterator_t</*기본*/>>
    = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>>;
    constexpr const iterator_t</*기본*/>& base() const& noexcept;
    constexpr iterator_t</*기본*/> base() &&;
    constexpr difference_type index() const noexcept;
    constexpr auto operator*() const
    {
      return /*참조-타입*/(/*pos_*/, */*current_*/);
    }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*기본*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*기본*/>
    {
      return /*참조-타입*/(/*위치_*/ + 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</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires random_access_range</*기본*/>;
    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</*기본*/>>)
    {
      return tuple<difference_type, range_rvalue_reference_t</*기본*/>>(
        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*/; // exposition-only
    // class template zip_view::sentinel
    template<bool>
    class /*sentinel*/; // 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 /*sentinel*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<Views> && ...)) {
        return begin() + iter_difference_t</*iterator*/<false>>(size());
      } else {
        return /*iterator*/<false>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto end() const
      requires(range<const Views> && ...)
    {
      if constexpr (!/*zip-is-common*/<const Views...>) {
        return /*sentinel*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      } else if constexpr ((random_access_range<const Views> && ...)) {
        return begin() + iter_difference_t</*iterator*/<true>>(size());
      } else {
        return /*iterator*/<true>(/*tuple-transform*/(ranges::end, /*views_*/));
      }
    }
    constexpr auto size()
      requires(sized_range<Views> && ...);
    constexpr auto size() const
      requires(sized_range<const Views> && ...);
  };
  template<class... Rs>
  zip_view(Rs&&...) -> zip_view<views::all_t<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</*maybe-const*/<Const, Views>>...> /*current_*/; // exposition-only
    constexpr explicit /*iterator*/(tuple<iterator_t</*maybe-const*/<Const, Views>>...>);
    // exposition-only
  public:
    using iterator_category = input_iterator_tag; // 항상 존재하는 것은 아님
    using iterator_concept  = /* 설명 참조 */;
    using value_type        = tuple<range_value_t</*maybe-const*/<Const, Views>>...>;
    using difference_type =
      common_type_t<range_difference_t</*maybe-const*/<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 /*양방향-전체*/<Const, Views...>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires /*all-random-access*/<Const, Views...>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires /*all-random-access*/<Const, Views...>;
    constexpr auto operator[](difference_type n) const
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires(equality_comparable<iterator_t</*maybe-const*/<Const, Views>>> && ...);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires /*all-random-access*/<Const, Views...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires(sized_sentinel_for<iterator_t</*maybe-const*/<Const, Views>>,
                                  iterator_t</*maybe-const*/<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</*maybe-const*/<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::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>...>>
  class zip_transform_view : public view_interface<zip_transform_view<F, Views...>>
  {
    /*movable-box*/<F> /*fun_*/; // exposition-only
    zip_view<Views...> /*zip_*/; // exposition-only
    using /*내부 뷰*/ = zip_view<Views...>; // exposition-only
    template<bool Const>
    using /*지퍼레이터*/ =
      iterator_t</*maybe-const*/<Const, /*내부 뷰*/>>; // exposition-only
    template<bool Const>
    using /*zentinel*/ =
      sentinel_t</*maybe-const*/<Const, /*내부 뷰*/>>; // exposition-only
    // class template zip_transform_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // class template zip_transform_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    zip_transform_view() = default;
    constexpr explicit zip_transform_view(F fun, Views... );
    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 /*sentinel*/<false>(/*zip_*/.end());
      }
    }
    constexpr auto end() const
      requires range<const /*InnerView*/> &&
               regular_invocable<const F&, range_reference_t<const Views>...>
    {
      if constexpr (common_range<const /*내부 뷰*/>) {
        return /*iterator*/<true>(*this, /*zip_*/.end());
      } else {
        return /*sentinel*/<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*/ = /*maybe-const*/<Const, zip_transform_view>; // exposition-only
    using /*기본*/   = /*maybe-const*/<Const, /*내부 뷰*/>;      // exposition-only
    /*Parent*/* /*부모_*/ = nullptr;                             // exposition-only
    /*지퍼레이터*/<Const> /*inner_*/;                               // exposition-only
    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</*maybe-const*/<Const, F>&,
                      range_reference_t</*maybe-const*/<Const, Views>>...>>;
    using difference_type = range_difference_t</*기본*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to</*지퍼레이터*/<false>, /*지퍼레이터*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* 설명 참조 */);
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*기본*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*기본*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable</*지퍼레이터*/<Const>>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for</*지퍼레이터*/<Const>, /*지퍼레이터*/<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 /*기본*/ = /*maybe-const*/<Const, V>; // exposition-only
    array<iterator_t</*기본*/>, N> /*current_*/ =
      array<iterator_t</*기본*/>, N>(); // exposition-only
    constexpr /*iterator*/(iterator_t</*기본*/> first,
                           sentinel_t</*기본*/> last); // exposition-only
    constexpr /*iterator*/(/*as-sentinel*/,
                           iterator_t</*기본*/> first,
                           iterator_t</*기본*/> last);
    // exposition-only
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 설명 참조 */;
    using value_type        = tuple</*REPEAT*/(range_value_t</*기본*/>, N)...>;
    using difference_type   = range_difference_t</*기본*/>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>>;
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*기본*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*Base*/> && three_way_comparable<iterator_t</*기본*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*기본*/>, iterator_t</*기본*/>>;
    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</*기본*/>>;
  };
}

클래스 템플릿 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_*/; // exposition-only
    using /*내부 뷰*/ = adjacent_view<V, N>; // exposition-only
    template<bool Const>
    using /*inner-iterator*/ =
      iterator_t</*maybe-const*/<Const, /*내부 뷰*/>>; // exposition-only
    template<bool Const>
    using /*inner-sentinel*/ =
      sentinel_t</*maybe-const*/<Const, /*내부 뷰*/>>; // exposition-only
    // class template adjacent_transform_view::iterator
    template<bool>
    class /*iterator*/; // exposition-only
    // class template adjacent_transform_view::sentinel
    template<bool>
    class /*sentinel*/; // exposition-only
  public:
    adjacent_transform_view() = default;
    constexpr explicit adjacent_transform_view(V base, F fun);
    constexpr V base() const&
      requires copy_constructible<V>
    {
      return /*inner_*/.base();
    }
    constexpr V base() && { return std::move(/*inner_*/).base(); }
    constexpr auto begin() { return /*iterator*/<false>(*this, /*inner_*/.begin()); }
    constexpr auto begin() const
      requires range<const /*내부 뷰*/> &&
               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 /*sentinel*/<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 /*sentinel*/<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*/ = /*maybe-const*/<Const, adjacent_transform_view>; // exposition-only
    using /*기본*/   = /*maybe-const*/<Const, V>;                       // exposition-only
    /*Parent*/* /*부모_*/ = nullptr;                                  // exposition-only
    /*inner-iterator*/<Const> /*inner_*/;                               // exposition-only
    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</*maybe-const*/<Const, F>&,
                                     /*REPEAT*/(range_reference_t</*기본*/>, N)...>>;
    using difference_type = range_difference_t</*기본*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const
               && convertible_to</*내부 반복자*/<false>, /*inner-iterator*/<Const>>;
    constexpr decltype(auto) operator*() const noexcept(/* 설명 참조 */);
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*기본*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/> &&
               three_way_comparable</*inner-iterator*/<Const>>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for</*inner-iterator*/<Const>, /*inner-iterator*/<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 for 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 for 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 for 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 for input_range s

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 for 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 for forward_range s

namespace std::ranges {
  template<view V>
    requires forward_range<V>
  template<bool Const>
  class chunk_view<V>::/*iterator*/
  {
    using /*Parent*/ = /*maybe-const*/<Const, chunk_view>; // exposition-only
    using /*기본*/   = /*maybe-const*/<Const, V>;          // exposition-only
    iterator_t</*기본*/> /*current_*/         = iterator_t</*기본*/>(); // exposition-only
    sentinel_t</*기본*/> /*end_*/             = sentinel_t</*기본*/>(); // exposition-only
    range_difference_t</*기본*/> /*n_*/       = 0;                      // exposition-only
    range_difference_t</*기본*/> /*missing_*/ = 0;                      // exposition-only
    constexpr /*iterator*/(/*Parent*/* parent,
                           iterator_t</*기본*/> 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_*/, /*end_*/), /*n_*/));
    using difference_type = range_difference_t</*기본*/>;
    /*iterator*/()        = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*기본*/>>;
    constexpr iterator_t</*기본*/> base() const;
    constexpr value_type operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr value_type operator[](difference_type n) const
      requires random_access_range</*기본*/>;
    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</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/> && three_way_comparable<iterator_t</*기본*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*기본*/>, iterator_t</*기본*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*기본*/>, iterator_t</*기본*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*기본*/>, iterator_t</*기본*/>>;
  };
}

클래스 템플릿 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 /*기본*/                    = /*maybe-const*/<Const, V>; // exposition-only
    iterator_t</*기본*/> /*current_*/ = iterator_t</*기본*/>();    // exposition-only
    iterator_t</*기본*/> /*last-ele_*/ =
      iterator_t</*기본*/>(); // exposition-only
                              // Base 모델이 슬라이드-캐시-퍼스트 방식인 경우에만 표시됨
    range_difference_t</*기본*/> /*n_*/ = 0; // exposition-only
    constexpr /*iterator*/(iterator_t</*기본*/> current,
                           range_difference_t</*기본*/> n) // exposition-only
      requires(!/*slide-caches-first*/</*기본*/>);
    constexpr /*iterator*/(iterator_t</*기본*/> current,
                           iterator_t</*기본*/> last_ele, // exposition-only
                           range_difference_t</*기본*/> n)
      requires /*slide-caches-first*/</*기본*/>;
  public:
    using iterator_category = input_iterator_tag;
    using iterator_concept  = /* 설명 참조 */;
    using value_type        = decltype(views::counted(/*current_*/, /*n_*/));
    using difference_type   = range_difference_t</*기본*/>;
    /*iterator*/()          = default;
    constexpr /*iterator*/(/*iterator*/<!Const> i)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>>;
    constexpr auto operator*() const;
    constexpr /*iterator*/& operator++();
    constexpr /*iterator*/ operator++(int);
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires random_access_range</*기본*/>;
    constexpr auto operator[](difference_type n) const
      requires random_access_range</*기본*/>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y);
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/> && three_way_comparable<iterator_t</*기본*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& i)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& i, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*기본*/>, iterator_t</*기본*/>>;
  };
}

클래스 템플릿 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
    // class template 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 /*Parent*/ = /*maybe-const*/<Const, stride_view>; // exposition-only
    using /*기본*/   = /*maybe-const*/<Const, V>;           // exposition-only
    iterator_t</*기본*/> /*current_*/         = iterator_t</*기본*/>(); // exposition-only
    sentinel_t</*기본*/> /*end_*/             = sentinel_t</*기본*/>(); // exposition-only
    range_difference_t</*기본*/> /*stride_*/  = 0;                      // exposition-only
    range_difference_t</*기본*/> /*missing_*/ = 0;                      // exposition-only
    constexpr /*iterator*/(/*Parent*/* parent,
                           iterator_t</*기본*/> current, // exposition-only
                           range_difference_t</*기본*/> missing = 0);
  public:
    using difference_type   = range_difference_t</*기본*/>;
    using value_type        = range_value_t</*기본*/>;
    using iterator_concept  = /* 설명 참조 */;
    using iterator_category = /* 설명 참조 */; // 항상 존재하는 것은 아님
    /*iterator*/()
      requires default_initializable<iterator_t</*기본*/>>
    = default;
    constexpr /*iterator*/(/*iterator*/<!Const> other)
      requires Const && convertible_to<iterator_t<V>, iterator_t</*기본*/>> &&
               convertible_to<sentinel_t<V>, sentinel_t</*기본*/>>;
    constexpr iterator_t</*기본*/> base() &&;
    constexpr const iterator_t</*기본*/>& base() const& noexcept;
    constexpr decltype(auto) operator*() const { return */*current_*/; }
    constexpr /*iterator*/& operator++();
    constexpr void operator++(int);
    constexpr /*iterator*/ operator++(int)
      requires forward_range</*기본*/>;
    constexpr /*iterator*/& operator--()
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/ operator--(int)
      requires bidirectional_range</*기본*/>;
    constexpr /*iterator*/& operator+=(difference_type n)
      requires random_access_range</*Base*/>;
    constexpr /*iterator*/& operator-=(difference_type n)
      requires random_access_range</*기본*/>;
    constexpr decltype(auto) operator[](difference_type n) const
      requires random_access_range</*기본*/>
    {
      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</*기본*/>>;
    friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/>;
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires random_access_range</*기본*/> && three_way_comparable<iterator_t</*기본*/>>
    ;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator+(difference_type n, const /*iterator*/& x)
      requires random_access_range</*기본*/>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type n)
      requires random_access_range</*기본*/>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires sized_sentinel_for<iterator_t</*기본*/>, iterator_t</*기본*/>>;
    friend constexpr difference_type operator-(default_sentinel_t y,
                                               const /*iterator*/& x)
      requires sized_sentinel_for<sentinel_t</*기본*/>, iterator_t</*기본*/>>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               default_sentinel_t y)
      requires sized_sentinel_for<sentinel_t</*기본*/>, iterator_t</*기본*/>>;
    friend constexpr range_rvalue_reference_t</*기본*/> 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
**번역 결과:**
HTML 태그와 속성은 번역하지 않고 원본 형식을 유지합니다.
``, `
`, `` 태그 내부의 텍스트는 번역하지 않습니다.
C++ 관련 용어는 번역하지 않습니다. 정확성과 전문성을 요구합니다.
제공된 텍스트는 이미 HTML 태그로 구성되어 있으며, 번역이 필요한 텍스트 요소가 포함되어 있지 않습니다. 따라서 원본을 그대로 유지합니다.
(x./*current_*/, y./*current_*/))) requires indirectly_swappable<iterator_t</*기본*/>>; }; }

클래스 템플릿 std::ranges::cartesian_product_view

namespace std::ranges {
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-random-access*/ = // exposition-only
    (random_access_range</*maybe-const*/<Const, First>> && ... &&
     (random_access_range</*maybe-const*/<Const, Vs>> &&
      sized_range</*maybe-const*/<Const, Vs>>));
  template<class R>
  concept /*cartesian-product-common-arg*/ = // exposition-only
    common_range<R> || (sized_range<R> && random_access_range<R>);
  template<bool Const, class First, class... Vs>
  concept /*cartesian-product-is-bidirectional*/ = // exposition-only
    (bidirectional_range</*maybe-const*/<Const, First>> && ... &&
     (bidirectional_range</*maybe-const*/<Const, Vs>> &&
      /*cartesian-product-common-arg*/</*maybe-const*/<Const, Vs>>));
  template<class First, class...>
  concept /*cartesian-product-is-common*/ = // exposition-only
    /*cartesian-product-common-arg*/<First>;
  template<class... Vs>
  concept /*cartesian-product-is-sized*/ = // exposition-only
    (sized_range<Vs> && ...);
  template<bool Const, template<class> class FirstSent, class First, class... Vs>
  concept /*cartesian-is-sized-sentinel*/ = // exposition-only
    (sized_sentinel_for<FirstSent</*maybe-const*/<Const, First>>,
                        iterator_t</*maybe-const*/<Const, First>>> &&
     ... &&
     (sized_range</*maybe-const*/<Const, Vs>> &&
      sized_sentinel_for<iterator_t</*maybe-const*/<Const, Vs>>,
                         iterator_t</*maybe-const*/<Const, Vs>>>));
  template</*cartesian-product-common-arg*/ R>
  constexpr auto /*cartesian-common-arg-end*/(R& r)
  { // exposition-only
    if constexpr (common_range<R>) {
      return ranges::end(r);
    } else {
      return ranges::begin(r) + ranges::distance(r);
    }
  }
  template<input_range First, forward_range... Vs>
    requires(view<First> && ... && view<Vs>)
  class cartesian_product_view
    : public view_interface<cartesian_product_view<First, Vs...>>
  {
  private:
    tuple<First, Vs...> /*bases_*/; // exposition-only
    // class template cartesian_product_view::iterator
    template<bool Const>
    class /*iterator*/; // exposition-only
  public:
    constexpr cartesian_product_view() = default;
    constexpr explicit cartesian_product_view(First first_base, Vs... 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>) &&
               /*cartesian-product-is-common*/<First, Vs...>);
    constexpr /*iterator*/<true> end() const
      requires /*cartesian-product-is-common*/<const First, const Vs...>;
    constexpr default_sentinel_t end() const noexcept;
    constexpr /* 설명 참조 */ size()
      requires /*cartesian-product-is-sized*/<First, Vs...>;
    constexpr /* 설명 참조 */ size() const
      requires /*cartesian-product-is-sized*/<const First, const Vs...>;
  };
  template<class... Vs>
  cartesian_product_view(Vs&&...) -> cartesian_product_view<views::all_t<Vs>...>;
}

클래스 템플릿 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</*maybe-const*/<Const, First>>,
                             range_value_t</*maybe-const*/<Const, Vs>>...>;
    using reference         = tuple<range_reference_t</*maybe-const*/<Const, First>>,
                            range_reference_t</*maybe-const*/<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</*maybe-const*/<Const, First>>;
    constexpr /*iterator*/& operator--()
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*iterator*/ operator--(int)
      requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>;
    constexpr /*iterator*/& operator+=(difference_type x)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    constexpr /*iterator*/& operator-=(difference_type x)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    constexpr reference operator[](difference_type n) const
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y)
      requires equality_comparable<iterator_t</*maybe-const*/<Const, First>>>;
    friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t);
    friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y)
      requires /*all-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator+(const /*iterator*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator+(difference_type x, const /*iterator*/& y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr /*iterator*/ operator-(const /*iterator*/& x, difference_type y)
      requires /*cartesian-product-is-random-access*/<Const, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterator*/& x,
                                               const /*iterator*/& y)
      requires /*cartesian-is-sized-sentinel*/<Const, iterator_t, First, Vs...>;
    friend constexpr difference_type operator-(const /*iterator*/& i, default_sentinel_t)
      requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>;
    friend constexpr difference_type operator-(default_sentinel_t, const /*iterator*/& i)
      requires /*cartesian-is-sized-sentinel*/<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</*maybe-const*/<Const, First>>> && ... &&
               indirectly_swappable<iterator_t</*maybe-const*/<Const, Vs>>>);
  private:
    using /*Parent*/ = /*maybe-const*/<Const, cartesian_product_view>; // exposition-only
    /*Parent*/* /*부모_*/ = nullptr;                                 // exposition-only
    tuple<iterator_t</*maybe-const*/<Const, First>>,
          iterator_t</*maybe-const*/<Const, Vs>>...>
      /*current_*/; // exposition-only
    template<size_t N = sizeof...(Vs)>
    constexpr void /*다음*/(); // exposition-only
    template<size_t N = sizeof...(Vs)>
    constexpr void /*이전*/(); // exposition-only
    template<class Tuple>
    constexpr difference_type /*distance-from*/(const Tuple& t) const; // exposition-only
    constexpr /*iterator*/(
      /*Parent*/& parent,
      tuple<iterator_t</*maybe-const*/<Const, First>>,
            iterator_t</*maybe-const*/<Const, Vs>>...> current); // exposition-only
  };
}

클래스 템플릿 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
의 제약 조건이 개요에서 잘못 지정됨
수정됨