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!


Log in to reply