In Abschnitt 6.4 des C++-Standards (Entwurf n2914 von c++0x) heißt es über das Format von if
Erklärungen:
Selektionsanweisungen wählen einen von mehreren Kontrollströmen aus.
selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement
condition:
expression
type-specifier-seq attribute-specifieropt declarator = initializer-clause
type-specifier-seq attribute-specifieropt declarator braced-init-list
Das Bit am Ende bedeutet, dass eine Bedingung entweder ein Ausdruck sein kann oder ein Konstrukt vom Typ Dekalarator.
Und in dem Moment, in dem der Parser auf die zweite Klammer stößt, wird es zu einem Ausdruck, also sind leider keine Deklarationen erlaubt.
Der Schnipsel:
if (int i = 2) { ... } else { ... }
ist vollkommen gültiges C++, in dem der Abschnitt if eine ganze Zahl definiert i
für die Dauer der if/else
und setzt ihn auf 2. Anschließend wird diese 2 als Eingabe für die if
(2 ist immer wahr, da es nicht Null ist).
Der Schnipsel if((int i = 2))
ist syntaktisch nicht anders als int x = (int i = 2;); if (x)
das ist no gültiges C++.