Konstruktorinitialisierungslistenauswertungsreihenfolge

Ich habe einen Konstruktor, der einige Argumente benötigt. Ich hatte angenommen, dass sie in der angegebenen Reihenfolge konstruiert wurden, aber in einem Fall scheint es, dass sie in umgekehrter Reihenfolge konstruiert wurden, was zu einem Abbruch führte. Wenn ich die Argumente umkehrte, hörte das Programm auf, abzubrechen. Dies ist ein Beispiel für die Syntax, die ich verwende. Die Sache ist, a_ muss in diesem Fall vor b_ initialisiert werden. Können Sie die Reihenfolge der Konstruktion garantieren?

z.B

class A { public: A(OtherClass o, string x, int y) : a_(o), b_(a_, x, y) { } OtherClass a_; AnotherClass b_; }; 

Es hängt von der Reihenfolge der Membervariablendeklaration in der class ab. Also wird a_ der erste sein, dann wird b_ der zweite in Ihrem Beispiel sein.

Um den Standard zu zitieren, zur Verdeutlichung:

12.6.2.5

Die Initialisierung wird in der folgenden Reihenfolge durchgeführt:

  • Dann werden nicht statische Datenelemente in der Reihenfolge initialisiert, in der sie in der classndefinition deklariert wurden (wiederum unabhängig von der Reihenfolge der mem-Initialisierer).

Die Standardreferenz dafür scheint jetzt 12.6.2 Abschnitt 13.3 zu sein:

(13.3) – Dann werden nicht statische Datenelemente in der Reihenfolge initialisiert, in der sie in der classndefinition deklariert wurden (wiederum unabhängig von der Reihenfolge der mem-Initialisierer).