class (oder struct) Selbstreferenz nach Vorlage

8

Ist das folgende legal?

%Vor%

Ein Kommentar zu diesem Beitrag scheint darauf hinzuweisen, dass dies nicht der Fall ist.

BEARBEITEN: Das erscheint mir nicht als ein "undefiniertes Verhalten" -Szenario. Die beabsichtigte Semantik ist eindeutig. Wenn es sich um eine ungültige Verwendung eines unvollständigen Typs handelt, sollte es sich um einen Fehler bei der Kompilierung handeln.

In meinen Tests scheint das gut zu funktionieren (ich habe beide GCC und Clang - beide mit -Wall -Werror -std=c++11 ).

Gibt es etwas in der Sprachdefinition (vor C ++ 17), das dies direkt oder indirekt als undefiniertes Verhalten angibt, oder ist es nur unterspezifiziert ?

?

Denken Sie daran, dass dies strukturell sehr ähnlich zu etwas wie dem Folgenden ist:

%Vor%     
nobar 09.09.2015, 19:20
quelle

1 Antwort

9

Tatsächlich haben wir als Ergebnis von N4371 (von N4527, [vector.overview], wird in C ++ 17 sein):

  

Ein unvollständiger Typ T kann verwendet werden, wenn der Vektor instanziiert wird, wenn der Zuordner die Vollständigkeit des Zuweisers erfüllt   Anforderungen 17.6.3.5.1. T muss vor jedem Mitglied der resultierenden Spezialisierung abgeschlossen sein   Vektor ist referenziert.

Vorher konnte vector nicht mit einem unvollständigen Typ erstellt werden (was tree_node an diesem Punkt ist), und das wäre undefiniertes Verhalten.

    
Barry 09.09.2015 19:31
quelle