[range.refinements]

25 Ranges library [ranges]

25.4 Range requirements [range.req]

25.4.6 Other range refinements [range.refinements]

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.

[Note 1:

This concept constrains some parallel algorithm overloads; see [algorithms].

— end note]