Unvollständige Typen und initializer_list

8

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?

%Vor%     
zrb 07.01.2016, 16:11
quelle

2 Antworten

3

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 von T . Dies widerspricht jedoch   [res.on.functions] / 2.5, da initializer_list nicht spezifisch ist   Erlaube unvollständige Typen (wie zum Beispiel std::unique_ptr   ([unique.ptr] / 5) und std::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).

    
Columbo 07.01.2016, 16:46
quelle
2

§ [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).

    
Jerry Coffin 07.01.2016 16:41
quelle

Tags und Links