Ich versuche, einige Metadaten für das Serialisieren / Deserialisieren von C ++ - Objekten zu modellieren. Hier ist etwas, das die Nüsse gefangen nimmt & amp; Schrauben von dem, was ich brauche; Es kompiliert mit GCC 5.2 ( g++ sample.cpp -std=c++14
) und mit Clang 3.6 ( clang++ sample.cpp -std=c++14
).
Meine Frage bezieht sich auf struct TypeInfo
im Beispiel. Es enthält ein std::initializer_list
von sich. Ist das normkonform?
Das führt bei der derzeitigen Formulierung zu undefiniertem Verhalten. Zum Zeitpunkt der Instanziierung von std::initializer_list<TypeInfo>
ist TypeInfo
unvollständig, daher gilt [res.on.functions] / (2.5):
Insbesondere sind die Effekte in den folgenden Fällen nicht definiert:
(2.5) - wenn ein unvollständiger Typ (3.9) als Template-Argument verwendet wird Instanziieren einer Vorlagenkomponente, sofern nicht ausdrücklich erlaubt diese Komponente.
... und unvollständige Typen sind für initializer_list
noch nicht explizit erlaubt - allerdings ist das eindeutig fehlerhaft. LWG Problem 2493 entscheidet sich dafür behebe das:
Der typische Anwendungsfall von
std::initializer_list<T>
ist für a pass-by-value-Parameter des Konstruktors vonT
. Dies widerspricht jedoch [res.on.functions] / 2.5, da initializer_list nicht spezifisch ist Erlaube unvollständige Typen (wie zum Beispielstd::unique_ptr
([unique.ptr] / 5) undstd::enable_shared_from_this
([util.smartptr.enab] / 2)).Eine Lösung wäre, den entsprechenden Text aus einem solchen zu kopieren und einzufügen Absatz.
i.e. Ihr Code ist in Ordnung (und wird offiziell nach Auflösung der oben genannten DR).
§ [res.on.functions] / 2:
Insbesondere sind die Effekte in den folgenden Fällen undefiniert:
[...]
(2.5) - wenn ein unvollständiger Typ (3.9) als Vorlagenargument verwendet wird, wenn eine Vorlagenkomponente instanziiert wird, es sei denn, für diese Komponente ist dies ausdrücklich erlaubt.
Ich sehe keine solche spezifische Toleranz für initializer_list
, die über einen unvollständigen Typ instanziiert werden soll (entweder in § [dcl.init.list] oder § [support.init.list], zumindest ab N4296).