10 Ranges library [ranges]

10.6 Range requirements [ranges.requirements]

10.6.3 Sized ranges [ranges.sized]

The SizedRange concept specifies the requirements of a Range type that knows its size in constant time with the size function.

template <class T> concept bool SizedRange = Range<T> && !disable_sized_range<remove_cv_t<remove_reference_t<T>>> && requires(T& t) { { ranges::size(t) } -> ConvertibleTo<difference_type_t<iterator_t<T>>>; };

Given an lvalue t of type remove_reference_t<T>, SizedRange<T> is satisfied only if:

  • ranges::size(t) is Ο(1), does not modify t, and is equal to ranges::distance(t).

  • If iterator_t<T> satisfies ForwardIterator, size(t) is well-defined regardless of the evaluation of begin(t). [ Note: size(t) is otherwise not required be well-defined after evaluating begin(t). For a SizedRange whose iterator type does not model ForwardIterator, for example, size(t) might only be well-defined if evaluated before the first call to begin(t).  — end note ]

Note: The disable_sized_range predicate provides a mechanism to enable use of range types with the library that meet the syntactic requirements but do not in fact satisfy SizedRange. A program that instantiates a library template that requires a Range with such a range type R is ill-formed with no diagnostic required unless disable_sized_range<remove_cv_t<remove_reference_t<R>>> evaluates to true ([structure.requirements]).  — end note ]