оператор while с инициализатором - PullRequest
1 голос
/ 30 января 2020

C ++ 17 имеет операторы выбора с инициализатором

status_code foo() {
    if (status_code c = bar(); c != SUCCESS) {
      return c;
    }
    // ...
}

Я хотел бы написать while -l oop и переменную с область действия ограничена для l oop и , инициализированных только один раз перед первой итерацией.

// fake example, doesn't compile, is doable in many ways
while (bool keep_trying = foo(); keep_trying) {
    // do stuff
    if (something)
        keep_trying = false;
}

Есть ли что-то для этого в C ++ 17 или, возможно, в C ++ 2а

Ответы [ 2 ]

3 голосов
/ 30 января 2020

P0305R1 , статья, которая вводит оператор if с инициализацией, объясняет это довольно хорошо. Из раздела Предложение :

В C ++ есть три оператора if, for и while, которые являются вариациями темы. Мы предлагаем сделать картину более полной, добавив новую форму выражения if.

while (cond) E;
for (init; cond; inc) E;
if (cond) E;
if (cond) E; else F;
if (init; cond) E;         (new!)
if (init; cond) E; else F; (new!)

(таблица упрощена)

Обратите внимание, что while (cond) соответствует for (init; cond; inc). Кроме того, из раздела Обсуждение :

Часто говорят, что C ++ уже достаточно сложен, и любая дополнительная сложность должна быть тщательно обоснована. Мы считаем, что предлагаемое расширение является естественным и неудивительным, и, следовательно, добавляет минимальную сложность и, возможно, даже устраняет некоторые из существующих различий между различными операторами потока управления. В локальной инициализации нет ничего, что задает c для операторов цикла, поэтому иметь его только в l oop, а не в операторе выбора, кажется произвольным. Если бы форма инициализатора оператора if была в языке с самого начала, она бы не казалась неуместной. (В лучшем случае можно было бы задаться вопросом, почему for также не пишется в то время, или наоборот.)

1 голос
/ 30 января 2020

"Хотя оператор с инициализатором" = "Для оператора без обновления"

И у вас всегда было for l oop независимо от версии языка.

...