std::ranges::size
| 헤더 <ranges>
|
||
| 에 정의됨 <iterator>
|
||
inline namespace /* unspecified */ {
inline constexpr auto size = /* unspecified */;
}
|
(C++20부터) (사용자 정의 지점 객체) |
|
| 호출 시그니처 |
||
template< class T >
requires /* see below */
constexpr auto size( T&& t );
|
(C++20부터) | |
t의 요소 수를 상수 시간에 계산합니다.
부분식이 주어졌을 때, 여기서 t은 (잠재적으로 구체화된) 결과 객체를 E로 나타내고, E의 타입은 T입니다:
- 만약
T이 경계를 알 수 없는 배열이면,ranges::size(E)는 잘못된 형식(ill-formed)입니다. - 그렇지 않고,
T이 배열 타입이면,ranges::size(E)는 표현식-동등하여 decay-copy (std::extent_v<T>)(C++23까지)auto(std::extent_v<T>)(C++23부터)입니다. - 그렇지 않고, 다음 모든 조건이 충족되면,
ranges::size(E)는 표현식-동등하여 decay-copy (t.size())(C++23까지)auto(t.size())(C++23부터)입니다:ranges::disable_sized_range<std::remove_cv_t<T>>는false입니다.- decay-copy
(t.size())(C++23까지)auto(t.size())(C++23부터)는 정수-유사 타입의 유효한 표현식입니다.
- 그렇지 않고, 다음 모든 조건이 충족되면,
ranges::size(E)는 표현식-동등하여 decay-copy (size(t))(C++23까지)auto(size(t))(C++23부터)입니다:T는 클래스 또는 열거형 타입입니다.ranges::disable_sized_range<std::remove_cv_t<T>>는false입니다.- decay-copy
(size(t))(C++23까지)auto(size(t))(C++23부터)는 정수-유사 타입의 유효한 표현식이며, 여기서size의 의미는 인자-의존 검색만 수행하여 확립된 것처럼 결정됩니다.
- 그렇지 않고, 다음 모든 조건이 충족되면,
ranges::size(E)는 표현식-동등하여to-unsigned-like(ranges::end(t) - ranges::begin(t))입니다:T는 forward_range를 모델링합니다.ranges::begin(t)의 타입이I이고ranges::end(t)의 타입이S일 때, sized_sentinel_for<S, I>와 forward_iterator<I>가 모두 모델링됩니다.to-unsigned-like(ranges::end(t) - ranges::begin(t))는 유효한 표현식입니다.
- 그렇지 않으면,
ranges::size(E)는 잘못된 형식(ill-formed)입니다.
위의 진단 가능한 잘못된 형식 사례는 치환 실패를 초래하며, 이는 ranges::size(E)가 템플릿 인스턴스화의 즉시 문맥에 나타날 때 발생합니다.
커스터마이제이션 포인트 객체
ranges::size
이름은
커스터마이제이션 포인트 객체
를 나타내며, 이는
함수 객체
의 리터럴
리터럴
semiregular
클래스 타입의 const 객체입니다. 자세한 내용은
CustomizationPointObject
를 참조하십시오.
참고 사항
표현식 ranges :: size ( e ) 가 유효할 때마다, 반환 타입은 integer-like 입니다.
C++20 표준은 기본
size
함수 호출이 prvalue를 반환하는 경우, 반환 값이 구체화된 임시 객체에서 이동 생성되도록 요구합니다. 모든 구현체는 직접 prvalue를 반환합니다. 이 요구사항은 구현체와 일치하도록 C++20 이후 제안서
P0849R8
에 의해 수정되었습니다.
표현식 ranges:: distance ( e ) 는 범위 e 의 크기를 결정하는 데에도 사용될 수 있습니다. ranges :: size ( e ) 와 달리, ranges:: distance ( e ) 는 e 가 크기가 지정되지 않은 범위인 경우에도 작동하지만, 그 경우 선형 복잡도의 비용이 발생합니다.
예제
#include <iostream> #include <ranges> #include <type_traits> #include <vector> int main() { auto v = std::vector<int>{}; std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n'; auto il = {7}; // std::initializer_list std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n'; int array[]{4, 5}; // array has a known bound std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n'; static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false); }
출력:
ranges::size(v) == 0 ranges::size(il) == 1 ranges::size(array) == 2
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P2602R2 | C++20 |
ADL
로 발견되는 특정 비멤버
size
를 금지하는 메커니즘이 존재함
|
해당 메커니즘 제거됨 |
참고 항목
|
(C++20)
|
범위의 크기와 동일한 부호 있는 정수를 반환함
(커스터마이제이션 포인트 객체) |
|
(C++20)
|
범위가 상수 시간에 자신의 크기를 알 수 있음을 명시함
(컨셉) |
|
(C++20)
|
반복자와 센티넬 사이의 거리, 또는 범위의 시작과 끝 사이의 거리를 반환함
(알고리즘 함수 객체) |
|
(C++17)
(C++20)
|
컨테이너나 배열의 크기를 반환함
(함수 템플릿) |