The expression
ranges::size(E) for some subexpression E with type
T is expression-equivalent to:

- Otherwise, if disable_sized_range<remove_cv_t<T>> ([range.sized]) is false:
- decay-copy(E.size()) if it is a valid expression and its type I models Integral.
- Otherwise, decay-copy(size(E))
if it is a valid expression and its type I
models Integral
with overload resolution performed in a context that includes
the declaration:
template<class T> void size(T&&) = delete;

and does not include a declaration of ranges::size.

- Otherwise, (ranges::end(E) - ranges::begin(E)) if it is a valid expression and the types I and S of ranges::begin(E) and ranges::end(E) (respectively) model both SizedSentinel<S, I> ([iterator.concept.sizedsentinel]) and ForwardIterator<I>.However, E is evaluated only once.
- Otherwise, ranges::size(E) is ill-formed.