¿Por qué no puedes declarar una variable dentro de la porción de expresión de un bucle do while?

La siguiente sintaxis es válida:

while (int i = get_data())
{
}

Pero lo siguiente no es:

do
{
} while (int i = get_data());

Podemos ver por qué a través del borrador del estándarN4140 sección6.4:

1 [...]

condition:
     expression
     attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
     attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

2 Las reglas de condiciones se aplican tanto adeclaraciones de selección y alfor ywhile declaraciones (6.5). [...]

y sección6.5

1 Las declaraciones de iteración especifican bucles.

      iteration-statement: 
             while ( condition ) statement
             do statement while ( expression ) ;

En cambio, estás obligado a hacer algo feo como:

int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic

¿Cuál es la razón de esto?

Respuestas a la pregunta(5)

Su respuesta a la pregunta