Время жизни объекта, объявленного во втором «параметре» оператора for.

Я только что обнаружил, что объявление можно разместить также во втором «параметре» оператора for. Но мне нигде не удалось найти, как он себя ведет в отношении построения / разрушения объекта, объявленного в этом параметре.

У нас есть этот простой код:

struct C {
  C() { puts("constr"); }
  ~C() { puts("destr"); }
};

int main() {
  for (int i = 0; auto h = std::make_unique<C>(); i++) {
    puts("in");
  }
}

Скажите, пожалуйста, когда h будет уничтожен? (после puts("in"), i++, ...?). Как себя ведет с break; и continue;?

Спасибо за разъяснение!

ИМО, он будет создаваться и уничтожаться на каждом этапе.

Zang MingJie 26.10.2018 09:31
7
1
199
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Время жизни объекта, созданного в условии цикла, привязано к области действия тела цикла, а также может использоваться в выражении итерации (i++ в вашем примере). Условие оценивается в начале каждая итерация, объект, который он создает, существует до конца этой итерации, затем уничтожается и создается снова для следующей итерации, и так далее. Операторы break или continue не влияют на время жизни объекта, созданного в условии.

Аргументация следующая. Из [stmt.for] мы видим, что цикл for определяется в терминах цикла while.

The for statement

for ( init-statement condition ; expression ) statement

is equivalent to

{
    init-statement
    while ( condition ) {
        statement
        expression ;
    }
}

Возвращение к [stmt. while] дает ответ на ваш вопрос (выделено мной):

When the condition of a while statement is a declaration, the scope of the variable that is declared extends from its point of declaration ([basic.scope.pdecl]) to the end of the while statement. A while statement whose condition is an initialized declaration of some variable t is equivalent to

label:
{ // start of condition scope
    condition; // declares t
    if (t) {
        statement
        goto label;
    }
} // end of condition scope

[ Note: The variable created in the condition is destroyed and created with each iteration of the loop. [...]]

Спасибо! С помощью этого объяснения я могу вывести также поведение break (уничтожить локальные переменные, уничтожить условие, уничтожить инициализацию) и continue (уничтожить локальные переменные, уничтожить условие) и возможность использовать «объект условия» также в третьем «параметре» for. .

Jarek C 26.10.2018 09:43

Хорошо, я тоже должен добавить это к ответу.

lubgr 26.10.2018 09:44

Подумайте просто, если я разработчик языка, следующие утверждения:

for ( a; b; c ) d

а также

for ( a; { b }; { c }) { d }

Должен быть строго эквивалентным

Очевидно, что некоторые переменные, определенные в a, могут использоваться в b, c, d, поэтому только a является особенным.

Кстати

Я думаю, что оператор for в Scala более красив. В Scala for - это просто синтаксис:

for (i <- v) s  <==> v.foreach(i => s)

Где

i => s

это синтаксис ламбы, например:

[](auto i){ s }

в C++ 11

Это универсально верно, переменная v любого типа, определяющая функцию foreach, может использоваться в операторе for.

Это не отвечает на вопрос. Наиболее близки к ошибкам b для a

Caleth 26.10.2018 10:30

Другие вопросы по теме