2013-12-04 3 views
1

Я совершенно не знаком с C++, поэтому вопрос может быть немного наивным: D! Недавно меня смутил вопрос, связанный с объявлением в диапазоне. Нам разрешено написать что-то вроде:Определить ссылку в цикле, основанном на диапазоне

for(int &i : vec) 

Тогда возникла путаница. Мне кажется, что переменная i будет определена один раз и будет присвоена различному значению в каждом цикле. Но в приведенном выше случае i - это ссылка, которая является просто псевдонимом и должна быть привязана только к одному объекту. Я думаю, что один способ прийти к этому - подумать, что каждый новый i. Я искал для дальнейшего объяснения по этому вопросу и нашел страницу: range for:


Синтаксис Attr (необязательно)

for (range_declaration : range_expression) loop_statement 

Объяснение

выше синтаксис создает код, подобный следующему (__range, __begin и __end предназначены только для экспозиции):

auto && __range = range_expression ; 
for (auto __begin = begin_expr, 

      __end = end_expr; 

     __begin != __end; ++__begin) { 

    range_declaration = *__begin; 
    loop_statement 
} 

«range_declaration» определен внутри цикла цикла. Но не является ли переменной, определенной внутри цикла, повторно используемой, что означает, что ссылка i, определенная в первом примере, повторно используется? Тем не менее, я смущен, и кто-нибудь, пожалуйста, дайте мне несколько советов. Благодаря!

ответ

4

Переменная, определенная внутри тела цикла, является локальной для тела цикла и, таким образом, уничтожается и переопределяется каждый раз, когда цикл повторяется. Таким образом, int &i только что инициализируется на каждой итерации, и проблем нет.

Это может быть яснее, если выполнение проектно подстановки (с некоторыми упрощениями) в примере вы публикуемую:

for (auto b = begin(vec), e = end(vec); b != e; ++b) { 
    int &i = *b; 
    //loop statement 
} 
+0

Привет Angew, спасибо очень много. Я получаю это сейчас. Я думаю, что мое недоразумение заключается в том, чтобы не быть понятным о переменных, определенных в цикле. Я думал, что переменные определены один раз и будут повторно использованы позже. Чтобы быть уверенным, предположим, что цикл for, который вы написали выше, имеет 10 итераций. В первом раунде ссылка i определена и после того, как завершена фигурная скобка, i разрушается. Теперь во втором раунде новая ссылка i определена и будет отброшена после завершения второго раунда. Эта модель продолжается до конца. У меня все получилось? Благодаря! – dylanG35

+0

@ dylanG35 Да, вы поняли это правильно. Вы можете легко убедиться в этом сами, создав класс, который делает что-то наблюдаемое (например, пишет в 'std :: cout') в его конструкторе и деструкторе и объявляет локальную переменную этого типа класса внутри цикла. Вы увидите, что ctor и dtor вызываются на каждой итерации. – Angew

Смежные вопросы