Wenn Ihr Compiler dies tut, ist es kaputt.
[dcl.init.list]/p3 (Alle Zitate von N4140):
List-Initialisierung eines Objekts oder einer Referenz des Typs T
ist wie folgt definiert:
- Wenn
T
ein Aggregat ist, wird die Aggregatinitialisierung durchgeführt (8.5.1).
- Wenn die Initialisierungsliste keine Elemente enthält und
T
ein Klassentyp mit einem Standardkonstruktor ist, lautet das Objekt value-initialized.
- [...]
[dcl.init]/p8:
auf ein Objekt der Typwert initialisieren T
bedeutet:
- wenn
T
ist ein (möglicherweise cv-qualifizierter) Klassentyp (Klausel 9) mit entweder keinem Standardkonstruktor (12.1) oder einem Standardkonstruktor, der vom Benutzer bereitgestellt oder gelöscht wird das Objekt wird standardmäßig initialisiert;
- wenn
T
ist ein (möglicherweise cv-qualifiziert) Klassentyp ohne einen vom Benutzer bereitgestellte oder gelöscht Standardkonstruktors, dann ist das Objekt Null initialisiert, und die semantischen Einschränkungen für default-Initialisierung werden überprüft, und wenn T a hat nicht-trivial Standard Konstruktor, das Objekt ist default-initialisiert;
- Wenn T ein Array-Typ ist, wird jedes Element initialisiert.
- Andernfalls wird das Objekt auf Null initialisiert.
Test_2
nicht ein Aggregat ist, so sollte t2
gewesen sein Wert initialisiert. Da der Standardkonstruktor von Test_2
nicht vom Benutzer bereitgestellt wird, sollte t2
als erstes null initialisiert werden (wodurch t2.i
auf 0 initialisiert wird), und dann wird der Standardkonstruktor ausgeführt.
Welcher Compiler und welche Version? '{}' sollte eine Wert-Initialisierung für Nicht-Aggregate sein und 't2.i' sollte Null-initialisiert sein, da es keinen vom Benutzer bereitgestellten Konstruktor hat. –
Das führt dazu, dass MSVC, das auf [rextester] gehostet wird (http://rextester.com/runcode), hängen bleibt und dann ähnlichen Müll gibt. Das gleiche gilt für einen anderen [MSVC Online-Compiler] (http://webcompiler.cloudapp.net/). Ich rieche einen Käfer. –