Ссылка на несколько объектов, как это возможно?
В одной из книг на С++ я читаю:
int v[] = {0,1,2,3,4,5,6,7,8,9};
for (auto& x : v)
Когда следующая строка в книге говорит:
".. ссылку не может ссылаться на другой объект после его инициализации..."
x относится ко всем v-объектам, как это работает?
Ответы
Ответ 1
Предоставлен диапазон для цикла
for ( range_declaration : range_expression ) loop_statement
Это эквивалентно
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Здесь range_declaration
является вашим auto& x
, он инициализируется для обозначения каждого элемента на каждой итерации, а не для повторной привязки к той же ссылке.
Ответ 2
x относится ко всем v объектам
Не в то же время. Каждый раз через цикл x
- это новая локальная переменная, которая ссылается на один элемент массива.
В псевдокоде №1 он похож на
for (int* it = std::begin(v); it != std::end(v); ++it)
{
int& x = *it; // new local variable
// ...
}
¹ Для деталей см. здесь http://en.cppreference.com/w/cpp/language/range-for