cpp/ranges/begin

Returns an iterator to the first element of the argument.

If the argument is an lvalue or is, then a call to  is expression-equivalent to:
 * 1)  if  has an array type.
 * 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 std.
 * 4) Otherwise,, if  is a class or enumeration type, that expression is valid and its type models std, 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 appears in the immediate context of a template instantiation.