[range.refinements]
25 Ranges library [ranges]
25.4 Range requirements [range.req]
25.4.6 Other range refinements [range.refinements]
input_range, forward_range, bidirectional_range, and random_access_range are defined similarly.
contiguous_range additionally requires that the ranges::data customization point object ([range.prim.data]) is usable with the range.
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>>>;
};
Given an expression t such that decltype((t)) is T&, T models contiguous_range only if to_address(ranges::begin(t)) == ranges::data(t) is true.
The common_range concept specifies requirements of a range type for which ranges::begin and ranges::end return objects of the same type.
[Example 1:
— end example]
template<class T>
concept common_range =
range<T> && same_as<iterator_t<T>, sentinel_t<T>>;
template<class R>
constexpr bool is-initializer-list = see below; // exposition only
For a type R, is-initializer-list<R> is true if and only if remove_cvref_t<R> is a specialization of initializer_list.
The viewable_range concept specifies the requirements of a range type that can be converted to a view safely.
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>))));
The constant_range concept specifies the requirements of a range type whose elements are not modifiable.
The exposition-only concept sized-random-access-range specifies the requirements of a range type that is sized and allows random access to its elements.