for Заявление на основе диапазона
for ( for-range-declaration : for-range-initializer ) statement
эквивалентно
{ auto &&__range = for-range-initializer ; auto __begin = begin-expr ; auto __end = end-expr ; for ( ; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
куда
если for-range-initializerесть expression, он рассматривается, как если бы он был заключен в круглые скобки (так что оператор запятой не может быть интерпретирован как разделяющий два init-declarators);
__range, __beginи __end - переменные, определенные только для демонстрации; а также
begin-expr и end-expr определяются следующим образом:
если for-range-initializer- выражение типа массива R, begin-expr и end-expr - __range и __range + __bound, соответственно, где __bound - граница массива. Если R это массив с неизвестной границей или массив неполного типа, программа имеет неправильный формат;
если for-range-initializerявляется выражением типа класса C, unqualified-ids begin и end ищутся в области видимости, C как если бы by class member access lookup, и если один из них (или оба) находит по крайней мере одно объявление, begin-expr и end-expr являются __range.begin() и __range.end(), соответственно;
в противном случае begin-expr и end-expr являются begin(__range) и end(__range), соответственно, где begin и end ищутся в associated namespaces. [ Note: Обычный unqualified lookup не выполняется. ] — end note
[ Example:
int array[5] = { 1, 2, 3, 4, 5 }; for (int& x : array) x *= 2;
— end example ]
В decl-specifier-seqa for-range-declarationкаждый decl-specifierдолжен быть либо a, type-specifier либо constexpr. Не decl-specifier-seqдолжен определять класс или перечисление.