23 Ranges library [ranges]

23.4 Range primitives [range.prim]

23.4.1 size [range.prim.size]

The name size denotes a customization point object.
The expression ranges::size(E) for some subexpression E with type T is expression-equivalent to:
  • decay-copy(extent_­v<T>) if T is an array type ([basic.compound]).
  • 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) model SizedSentinel<S, I> ([iterator.concept.sizedsentinel]) and ForwardIterator<I>.
    However, E is evaluated only once.
  • Otherwise, ranges::size(E) is ill-formed.
    [Note
    :
    This case can result in substitution failure when ranges::size(E) appears in the immediate context of a template instantiation.
    end note
    ]
[Note
:
Whenever ranges::size(E) is a valid expression, its type models Integral.
end note
]