Я совершенно не знаком с 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, определенная в первом примере, повторно используется? Тем не менее, я смущен, и кто-нибудь, пожалуйста, дайте мне несколько советов. Благодаря!
Привет Angew, спасибо очень много. Я получаю это сейчас. Я думаю, что мое недоразумение заключается в том, чтобы не быть понятным о переменных, определенных в цикле. Я думал, что переменные определены один раз и будут повторно использованы позже. Чтобы быть уверенным, предположим, что цикл for, который вы написали выше, имеет 10 итераций. В первом раунде ссылка i определена и после того, как завершена фигурная скобка, i разрушается. Теперь во втором раунде новая ссылка i определена и будет отброшена после завершения второго раунда. Эта модель продолжается до конца. У меня все получилось? Благодаря! – dylanG35
@ dylanG35 Да, вы поняли это правильно. Вы можете легко убедиться в этом сами, создав класс, который делает что-то наблюдаемое (например, пишет в 'std :: cout') в его конструкторе и деструкторе и объявляет локальную переменную этого типа класса внутри цикла. Вы увидите, что ctor и dtor вызываются на каждой итерации. – Angew