12

So erfordert der C++ - Standard, dass Klassenmitglieder in der Reihenfolge initialisiert werden, in der sie in der Klasse deklariert sind, und nicht in der Reihenfolge, in der sie in der Initialisierungsliste eines Konstruktors aufgeführt sind. Dies impliziert jedoch nichts über die Reihenfolge, in der die Argumente für diese Initialisierungen ausgewertet werden. Ich arbeite mit einem System, das häufig Verweise auf Serialisierungsobjekte übergibt und mich fragt, ob ich sicherstellen kann, dass Bits in der richtigen Reihenfolge gelesen werden, unabhängig davon, in welcher Reihenfolge diese Bits in die Felder des Objekts geschrieben werden.Initialisierungsliste * Argument * Evaluierungsreihenfolge

struct Foo { 
    int a; 
    double b; 
    // I want to be able to do this 
    Foo(SerObj &s) 
    : b(s.readDouble()), a(s.readInt()) 
    { } 
    // Rather than this 
    Foo (SerObj &s) 
    { 
     b = s.readDouble(); 
     a = s.readInt(); 
    } 
}; 

Offensichtlich Neuordnungs Dinge wie ints und doubles in der Erklärung ist nicht allzu große Sache, aber größere Objekte und Dinge erfordern dynamische Zuordnung kann manchmal sein.

+0

Ich habe zuerst verpasst, dass die Bestellungen anders sind, hehe :) –

Antwort

21

C++ Standard-12.6.2/3:

Es gibt einen Sequenzpunkt (1,9) nach der Initialisierung jeder Basis und Mitglied. Die Ausdruckliste eines Mem-Initialisierers wird als Teil der Initialisierung der entsprechenden Basis oder des entsprechenden Members ausgewertet.

Die Reihenfolge der Initialisierung ist diejenige, die Sie in der Frage angegeben haben. Die Auswertung ist Teil dieser Initialisierung und die Initialisierungen können nicht verschachtelt werden (da zwischen ihnen ein Sequenzpunkt liegt).

Das bedeutet, dass die Funktionsaufrufe in Ihren Initialisierungslisten nicht in der gewünschten Reihenfolge aufgerufen werden, sondern in der Reihenfolge, in der die Elementdeklarationen angezeigt werden.

+0

Könnten Sie bitte einen Link zur Quelle hinzufügen? Vielen Dank. –

+0

Entschuldigung, wenn ich falsch gelesen habe, aber war nicht die Frage über die Bewertungsreihenfolge der Argumente zu den Mitgliedskonstruktoren in ihrer jeweiligen Initialisierung? Was sollte undefiniert sein? –

+0

Hm, wahrscheinlich nicht, da es jeweils nur ein Argument gibt. –