if the for-range-initializer is an expression,
it is regarded as if it were surrounded by parentheses (so that a comma operator
cannot be reinterpreted as delimiting two init-declarators);
if the for-range-initializer is an expression of
array type R, begin-expr and end-expr are
__range and __range + __bound, respectively, where __bound is
the array bound.
If R is an array of unknown bound or an array of
incomplete type, the program is ill-formed;
if the for-range-initializer is an expression of
class type C, the unqualified-idsbegin and end are looked up in the scope of C
as if by class member access lookup ([basic.lookup.classref]), and if either
(or both) finds at least one declaration, begin-expr and
end-expr are __range.begin() and __range.end(),
respectively;
otherwise, begin-expr and end-expr are begin(__range)
and end(__range), respectively, where begin and end are looked
up in the associated namespaces ([basic.lookup.argdep]).