Namespaces
Variants

std::ranges:: sized_range, std::ranges:: disable_sized_range

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <ranges>
(1)
template < class T >

concept sized_range = ranges:: range < T > &&
requires ( T & t ) {
ranges:: size ( t ) ;

} ;
(C++20부터)
(C++26까지)
template < class T >

concept sized_range = ranges :: approximately_sized_range < T > &&
requires ( T & t ) {
ranges:: size ( t ) ;

} ;
(C++26부터)
template < class >
constexpr bool disable_sized_range = false ;
(2) (C++20부터)
1) sized_range 개념은 range (until C++26) approximately_sized_range (since C++26) 타입의 요구사항을 지정하며, size 함수를 통해 상수 시간에 크기를 알 수 있는 특성을 가집니다.
2) disable_sized_range size 함수를 제공하지만(멤버 함수 또는 비멤버 함수로) 실제로 sized_range 를 모델링하지 않는 범위 타입의 사용을 허용하기 위해 존재합니다. 사용자는 cv-한정자가 없는 프로그램 정의 타입에 대해 disable_sized_range 를 특수화할 수 있습니다. 이러한 특수화는 상수 표현식 에서 사용 가능해야 하며 const bool 타입을 가져야 합니다.

목차

의미론적 요구사항

1) 타입 std:: remove_reference_t < T > 의 lvalue t 가 주어졌을 때, T sized_range 를 모델링하려면 다음 조건을 만족해야 합니다:
  • 만약 ranges:: iterator_t < T > forward_iterator 를 모델링한다면, ranges:: size ( t ) ranges:: begin ( t ) 의 평가와 관계없이 잘 정의되어야 합니다 (즉, 단일 패스 크기 범위는 begin의 첫 번째 호출 전에만 size 호출을 지원할 수 있지만, 순방향 범위는 항상 size를 지원해야 합니다).

참고 사항

disable_sized_range 는 반복자와 센티넬이 sized_sentinel_for 를 만족하는 범위의 사용을 옵트아웃하는 데 사용할 수 없습니다; std::disable_sized_sentinel_for 를 대신 사용해야 합니다.

disable_sized_range 는 배열 타입이나 참조 타입에 대해 특수화될 수 없습니다.

기능 테스트 매크로 표준 기능
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range ranges::reserve_hint

예제

#include <forward_list>
#include <list>
#include <ranges>
static_assert
(
    std::ranges::sized_range<std::list<int>> and
    not std::ranges::sized_range<std::forward_list<int>>
);
int main() {}

참고 항목

반복자 타입이 random_access_iterator 를 만족하는 범위를 지정함
(컨셉)
반복자 타입이 contiguous_iterator 를 만족하는 범위를 지정함
(컨셉)