#новичкам
Решение из предыдущего поста не совсем идеальное. Посмотрите сами:
Foo generateData() {
return Foo{std::vector{1, 2, 3, 4, 5}};
}
auto data = generateData();
for (int x : data.items()) {
process(x);
}Переменная data больше нигде кроме цикла не нужна. Но она засоряет собой и своим именем скоуп, требует отдельной инструкции, да и хотелось бы сразу избавляться от ненужного.
Было бы идеально инициализировать data прям внутри скоупа цикла, как это делается в условных операторах. И с С++20 это стало возможным:
Foo generateData() {
return Foo{std::vector{1, 2, 3, 4, 5}};
}
for (auto data = generateData(); int x : data.items()) {
process(x);
}Вот и все. Мы также создаем lvalue объект, но теперь его время жизни ограничено телом цикла. При выходе из цикла он уничтожится и мы можем забыть про этот объект.
Кстати. А задавались вы вопросом "нужны ли инструкции инициализации в цикле while?"
В if есть, в во всех вариантах цикла for есть. Для единообразия нужно и в while.
Как думаете?
На самом деле это будет избыточно. while+инициализация выглядела бы так:
while(size_t i = 0; some_condition) {...}Это легко заменяется на классический for без указания инструкций, которые после каждой итерации выполняются:
for(size_t i = 0; some_condition;) {...}Даже короче получилось. Поэтому инициализация в while не нужна.
Forget about garbage. Stay cool.
#cpp20