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,
it is possible for repeated calls
to not return equal values or to not be well-defined.
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.