Следующий синтаксис действителен:
while (int i = get_data())
{
}
Но следующее не так:
do
{
} while (int i = get_data());
Мы можем видеть, почему через проект стандарта N4140
раздел 6.4:
1 [...]
condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list2 Правила для условий применяются как к операторам выбора, так и к операторам
for
иwhile
(6.5). [...]
и раздел 6.5
1 Итерационные операторы определяют цикл.
iteration-statement:while
( condition ) statementdo
statementwhile
( expression ) ;
Вместо этого вы вынуждены делать что-то ужасное:
int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
Что является обоснованием для этого?