2017-07-08 3 views
0

Ich hatte den Eindruck, dass die folgenden LecksIst die Reihenfolge der Auswertung für Initialisierungslisten in Konstruktoren festgelegt?

anfällig ist
class Something { 
    std::unique_ptr<A> a; 
    std::unique_ptr<int> b{new int{3}}; 
    std::unique_ptr<C> c; 
public: 
    Something() : a{new A{}}, c{new C{}} {}; 
}; 

, wenn die Reihenfolge der Auswertung der

  1. new A{}
  2. new int{3}
  3. new C{}
  4. a{}
  5. folgenden wurde
  6. b{}
  7. c{}

ich einen Blick auf den neuen C++ 17-Funktion (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf), die Reihenfolge der Auswertung von Fehlern in früheren Versionen von C fixiert ++, aber es scheint nur über Funktionsargument Auswertungen zu sprechen .

Ich schaute mir die cppreference-Dokumentation in der Reihenfolge der Auswertung an (http://en.cppreference.com/w/cpp/language/eval_order) und es scheint auch nicht zu erwähnen.

Hat das Obige eine gut definierte Reihenfolge der Auswertung? (entweder jetzt in C++ 17 oder in früheren Versionen von C++)

+0

Dies sind verschiedene Voll exp Sitzungen. –

+0

@ T.C. Meine Frage ein wenig aktualisiert. – Curious

+0

@ Jarod42 Tippfehler .. behoben, dass – Curious

Antwort

5

Nein, diese Reihenfolge ist nicht erlaubt; Die Sprache ist nicht so verrückt.

Dies sind völlig verschieden Voll Ausdrücke, so wird es von [intro.execution]/16 gesteuert:

Jede Wertberechnung und Nebenwirkung mit einem Ausdruck Voll assoziierte vor jeder Wertberechnung sequenziert und Seiten Effekt mit dem zugehörigen nächster auszudrückender Ausdruck

+0

Danke! Könnten Sie mich auf einen Ort im Standard verweisen, der besagt, dass es sich um ganz bestimmte Ausdrücke handelt? – Curious

+1

@Curious https://timsong-cpp.github.io/cppwp/intro.execution#12 –

+0

Vielen Dank! Könnten Sie das auch in die Antwort aufnehmen? Oder ich kann es auch bearbeiten – Curious

1

Jede Elementinitialisierung wird als separate Anweisung behandelt, und die Reihenfolge zwischen diesen Anweisungen ist genau definiert.

So in Ihrem Beispiel die Reihenfolge wie definiert werden wird:

  1. neue A {}
  2. a {}
  3. new int {3}
  4. b {}
  5. neue C {}
  6. c {}
Verwandte Themen