Initialisierung der templated, recursive, POD struct

8

Ich habe mit der Template-Rekursion experimentiert, um eine verschachtelte POD-Struktur zu erzeugen, und ich bin auf ein Verhalten gestoßen, das ich nicht erwartet hatte. Hier ist ein vereinfachter Testfall:

%Vor%

Ich würde erwarten, dass dieser Code ausgegeben wird

%Vor%

In der Tat, dass es was ist, wenn ich mit GCC 4.8.4 und 5.1 kompiliere.

Das Kompilieren mit Clang (3.5 oder 3.7) oder Visual Studio 2010 führt jedoch stattdessen zu

%Vor%

Ist mein Code oder mein Verständnis in irgendeiner Weise falsch, oder haben Clang und Visual Studio beide Fehler, die zu der gleichen fehlerhaften Ausgabe führen?

    
rkjnsn 19.08.2015, 02:10
quelle

1 Antwort

3

Ich denke, dass beide Compiler konform sind, da die Reihenfolge der Initialisierung von statischen Variablen nicht spezifiziert ist. Die klarste Aussage kommt von einer Notiz in [basic.start.init]:

  

[Hinweis: Wenn sich die Initialisierung eines Objekts obj1 auf ein Objekt obj2 des Namensraumbereichs bezieht   die möglicherweise eine dynamische Initialisierung erfordert und später in derselben Übersetzungseinheit definiert wird, ist nicht spezifiziert   ob der Wert von obj2 verwendet wird, ist der Wert des vollständig initialisierten obj2 (weil obj2 statisch war   initialisiert) oder wird der Wert von obj2 lediglich null-initialisiert. Zum Beispiel

%Vor%      

-Endnote]

In unserem Fall wurde Builder<start, 1>::value statisch initialisiert, aber alles andere ist dynamisch nicht initialisiert - es ist also nicht spezifiziert, ob das vollständig initialisierte Builder<start, 1>::value verwendet wird oder nicht.

Eine Umgehungslösung besteht darin, das Konstrukt bei der ersten Verwendung zu verwenden und etwas zu tun (ich habe mir die Freiheit genommen, Builder aus RecursiveStruct einfach herauszuziehen - es zeigt dasselbe Verhalten):

%Vor%

Dies druckt 5 auf beiden Compilern.

    
Barry 19.08.2015, 02:50
quelle

Tags und Links