[range.refinements] (original) (raw)

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](#concept:contiguous%5Frange "25.4.6 Other range refinements [range.refinements]") = [random_access_range](#concept:random%5Faccess%5Frange "25.4.6 Other range refinements [range.refinements]")<T> && [contiguous_iterator](iterator.concept.contiguous#concept:contiguous%5Fiterator "24.3.4.14 Concept contiguous_­iterator [iterator.concept.contiguous]")<iterator_t<T>> && requires(T& t) { { ranges::data(t) } -> [same_as](concept.same#concept:same%5Fas "18.4.2 Concept same_­as [concept.same]")<add_pointer_t<range_reference_t<T>>>;};

Given an expression t such that decltype((t)) is T&,T models contiguous_range only ifto_address(​ranges​::​begin(t)) == ranges​::​data(t)is true.

The common_range concept specifies requirements of a range type for which ranges​::​begin andranges​::​end return objects of the same type.

[Example 1:

— _end example_]

template<class T> concept [common_range](#concept:common%5Frange "25.4.6 Other range refinements [range.refinements]") = [range](range.range#concept:range "25.4.2 Ranges [range.range]")<T> && [same_as](concept.same#concept:same%5Fas "18.4.2 Concept same_­as [concept.same]")<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 ifremove_cvref_t<R> is a specialization of initializer_list.

The viewable_range concept specifies the requirements of arange type that can be converted to a view safely.

template<class T> concept [viewable_range](#concept:viewable%5Frange "25.4.6 Other range refinements [range.refinements]") = [range](range.range#concept:range "25.4.2 Ranges [range.range]")<T> && (([view](range.view#concept:view "25.4.5 Views [range.view]")<remove_cvref_t<T>> && [constructible_from](concept.constructible#concept:constructible%5Ffrom "18.4.11 Concept constructible_­from [concept.constructible]")<remove_cvref_t<T>, T>) || (![view](range.view#concept:view "25.4.5 Views [range.view]")<remove_cvref_t<T>> && (is_lvalue_reference_v<T> || ([movable](concepts.object#concept:movable "18.6 Object concepts [concepts.object]")<remove_reference_t<T>> && !_is-initializer-list_<T>))));

The constant_range concept specifies the requirements of arange type whose elements are not modifiable.

The exposition-only concept sized-random-access-rangespecifies 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_]