Auswertungsreihenfolge der Initialisierungliste garantiert?
-
Ist garantiert, dass dieses Programm "ab" ausgibt?
int f( const char *c ) { std::cout << c; return 0; } struct C { int a, b; C() : a( f( "a" ) ), // gibt "a" aus b( f( "b" ) ) // gibt "b" aus { } }; int main() { C c; }
Wenn nein, kann ich C so ändern, damit "ab" garantiert wird, a und b aber immer noch in der Initialisierungsliste initialisiert werden?
-
Ja, es ist garantiert. Aber nicht wegen der Reihenfolge in der Initialisierungsliste, sondern wegen der Reihenfolge der Memberdeklarationen. Wenn du
int b, a;
geschrieben hättest, wäre die Ausgabe auch "ba".
-
a wird vor b initialisiert, weil Member a vor b deklariert wird (das habe ich noch von irgendwo in Erinnerung).
Nur um nochmal sicher zu gehen: Weil a vor b initialisiert wird, werden auch alle Argumente von a vor allen Argumenten von b ausgewertet?
-
reihenfolger schrieb:
Nur um nochmal sicher zu gehen: Weil a vor b initialisiert wird, werden auch alle Argumente von a vor allen Argumenten von b ausgewertet?
Richtig, denn aufgrund der Deklarationsreihenfolge wird auch der Code entsprechend ausgeführt, wenn die Variable dran ist.
-
Ok, danke euch beiden!