Let E and F be expressions,
let T be remove_cvref_t<decltype((E))>, and
let D be range_difference_t<decltype((E))>.

Otherwise, the expression views::take(E, F)
is expression-equivalent to:

- If T is a specialization of ranges::empty_view ([range.empty.view]), then ((void) F,
*decay-copy*(E)), except that the evaluations of E and F are indeterminately sequenced. - Otherwise, if T models random_access_range and sized_range and is a specialization of span ([views.span]), basic_string_view ([string.view]), or ranges::subrange ([range.subrange]), then U(ranges::begin(E), ranges::begin(E) + std::min<D>(ranges::distance(E), F)), except that E is evaluated only once, where U is a type determined as follows:
- otherwise, if T is a specialization of ranges::iota_view ([range.iota.view]) that models random_access_range and sized_range, then ranges::iota_view(*ranges::begin(E), *(ranges::begin(E) + std::

min<D>(ranges::distance(E), F))), except that E is evaluated only once; - Otherwise, ranges::take_view(E, F).