std::ranges::sized_range, std::ranges::disable_sized_range
cppreference.net에서
| 헤더 <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
에 정의됨 (1) | (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(C++26까지)approximately_sized_range(C++26부터) 타입이 size 함수를 통해 상수 시간에 그 크기를 알 수 있는 요구 사항을 지정합니다.2)
disable_sized_range는 size 함수(멤버 또는 비멤버로 제공)를 제공하지만 실제로는 sized_range을 모델링하지 않는 range 타입의 사용을 허용하기 위해 존재합니다. 사용자는 cv 한정되지 않은 프로그램 정의 타입에 대해 disable_sized_range을 특수화할 수 있습니다. 이러한 특수화는 상수 표현식에서 사용 가능해야 하며, 타입이 const bool이어야 합니다.의미론적 요구사항
1)
타입
std::
remove_reference_t
<
T
>
의 lvalue
t
가 주어졌을 때,
T
가
sized_range
를 모델링하려면 다음 조건을 만족해야 합니다:
- ranges:: size ( t )
-
- 분할 상환 상수 시간 복잡도를 가지며,
- 동등성 보존 표현식에서 관찰 가능한 방식으로 t 의 값을 변경하지 않으며,
- ranges:: distance ( ranges:: begin ( t ) , ranges:: end ( t ) ) 와 동일해야 합니다.
-
만약
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() {}
참고 항목
|
(C++20)
|
반복자 타입이
random_access_iterator
를 만족하는 범위를 지정함
(컨셉) |
|
(C++20)
|
반복자 타입이
contiguous_iterator
를 만족하는 범위를 지정함
(컨셉) |