cpp/ranges/end

Returns a sentinel indicating the end of a range.

If the argument is an lvalue or is, then a call to  is expression-equivalent to:
 * 1)  if  has an array type of known bound.
 * 2) * If is incomplete, then the call to  is ill-formed, no diagnostic required.
 * 3) Otherwise,, if that expression is valid, and its type models.
 * 4) Otherwise,, if  is a class or enumeration type, that expression is valid and its converted type models , where the overload resolution is performed with the following candidates:
 * 5) * any declarations of found by argument-dependent lookup.

In all other cases, a call to is ill-formed, which can result in substitution failure when the call to  appears in the immediate context of a template instantiation.