The range concept defines the requirements of a type that allows
iteration over its elements by providing an iterator and sentinel
that denote the elements of the range.
The required expressions
ranges::begin(t)
and
ranges::end(t)
of the range concept
do not require implicit expression variations ([concepts.equality]).
Equality preservation of both ranges::begin and
ranges::end enables passing a range whose iterator
type models forward_iterator to multiple
algorithms and making multiple passes over the range by repeated calls to
ranges::begin and ranges::end.
Since ranges::begin is not required to be equality-preserving
when the return type does not model forward_iterator, repeated calls
might not return equal values or might not be well-defined.
Given an expression E such that decltype((E)) is T,
T models borrowed_range only if
the validity of iterators obtained from the object denoted by E
is not tied to the lifetime of that object.
Since the validity of iterators is not tied to the lifetime of
an object whose type models borrowed_range,
a function can accept arguments of such a type by value and
return iterators obtained from it without danger of dangling.