Цикл for в C ++, основанный на диапазоне, на самом деле является просто синтаксическим сахаром, эквивалентным следующему (предоставляется cppreference :
for (range_declaration : range_expression) loop_statement;
// is equivalent to:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
В приведенном выше блоке кода begin_expr
и end_expr
эквивалентны std::begin(__range)
и std::end(__range)
соответственно.
Таким образом, в случае использования const int &arrEntry
, arrEntry
фактически объявляется внутри "реального" (нормального) для цикла итаким образом, в каждой итерации он ссылается на другой объект в диапазоне, как если бы он напрямую использовал необработанные итераторы.
Обратите внимание, что это было бы невозможно, если бы arrEntry
был объявлен вне цикла for, как ссылкине может быть переназначен для ссылки на другой объект.
Еще один важный (побочный) факт, который следует учитывать, заключается в том, что range_expression
сохраняется в течение всей продолжительности цикла, что означает, что вы можете использовать prvalue там (например, вызов функции, которая возвращает std::vector<int>
по значению.