Чаще всего нам нужны петли вроде этого
do
{
Type value(GetCurrentValue());
Process(value);
}while(condition(value));
К сожалению, это не скомпилируется, потому что область value
заканчивается на }
. Это означает, что мне придется объявить его вне цикла.
Type value;
do
{
value = GetCurrentValue();
Process(value);
}while(condition(value));
Мне это не нравится по крайней мере по двум причинам. Во-первых, мне нравится декларировать вещи на местном уровне. И, во-вторых, это проблема, если значение не может быть назначаемым или конструктивным по умолчанию, но только для копирования.
Итак, мой вопрос имеет две стороны. Во-первых, я хотел бы знать, была ли какая-то конкретная причина/трудность в расширении do, пока область действия также была до конечного условия (так же как область переменных, объявленных в цикле for, включает тело цикла for, несмотря на то, что оно физически вне брекетов). И если вы считаете, что ответ на мой первый вопрос: "Это так, как есть. Не спрашивайте, почему вопросы". то я хотел бы знать, есть ли идиомы, которые могут помочь написать циклы do-while, похожие на те, что приведены в моем примере, но без упоминавшихся ниже минусов.
Надеюсь, что вопросы понятны.