[range.utility.helpers]

# 25 Ranges library [[ranges]](./#ranges)

## 25.5 Range utilities [[range.utility]](range.utility#helpers)

### 25.5.2 Helper concepts [range.utility.helpers]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L1748)

Many of the types in [[range.utility]](range.utility "25.5 Range utilities") are specified in terms of
the following exposition-only concepts:template<class R>concept [*simple-view*](#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]") = // *exposition only*[view](range.view#concept:view "25.4.5 Views [range.view]")<R> && [range](range.range#concept:range "25.4.2 Ranges [range.range]")<const R> &&[same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")<iterator_t<R>, iterator_t<const R>> &&[same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")<sentinel_t<R>, sentinel_t<const R>>;

template<class I>concept [*has-arrow*](#concept:has-arrow "25.5.2 Helper concepts [range.utility.helpers]") = // *exposition only*[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]")<I> && (is_pointer_v<I> || requires(const I i) { i.operator->(); });

template<class T, class U>concept [*different-from*](#concept:different-from "25.5.2 Helper concepts [range.utility.helpers]") = // *exposition only*![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")<remove_cvref_t<T>, remove_cvref_t<U>>;

template<class R>concept [*range-with-movable-references*](#concept:range-with-movable-references "25.5.2 Helper concepts [range.utility.helpers]") = // *exposition only*[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<R> && [move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_­constructible [concept.moveconstructible]")<range_reference_t<R>> &&[move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_­constructible [concept.moveconstructible]")<range_rvalue_reference_t<R>>;
