Проблема в том, что стандарт разрешает вам декларацию в скобках. Что вы хотите сделать, так это получить объявление как часть выражения, что стандарт не позволит вам сделать.
while () может иметь один из двух синтаксисов: while () или while (). Объявление использует «=» и выглядит как выражение, но это другая синтаксическая сущность.
Когда вы пишете
while(int i = 1) {
}
, это прекрасно. «int i = 1» является объявлением. Однако, то, что вы хотите, это
while ( (int i = 1) + 3) {
}
Это совсем другое животное. Вы хотите выражение внутри while (), где одним из условий выражения является объявление. Теперь объявление - это утверждение, и как таковое не может быть частью выражения. Вот почему то, что вам нужно сделать, не может быть сделано.
(после написания всей напыщенной речи я заметил, что 2 других человека написали то же самое. О, хорошо, чем больше, тем лучше)