Wann muss ein als Vorlageargument verwendeter Typ vollständig sein, wenn er intern in einem Kontext verwendet wird, der einen vollständigen Typ erfordert? [Duplikat]

8

Ich habe eine Frage, die mich ein paar Stunden lang verwirrt hat.

Zuerst dachte ich, dass der Typ am Punkt der Instanziierung abgeschlossen sein müsste

, aber alle Compiler, die ich versucht habe, akzeptieren den Typ, der zu diesem Zeitpunkt noch unvollständig ist, solange er definiert ist überall in der Übersetzungseinheit.

Um es zu veranschaulichen, geht es um die Korrektheit dieses einfachen Programms:

%Vor%

Nach §14.6.4.1 / 1 ist der Punkt der Instanziierung von size<test> die mit [1] markierte Linie, und zu diesem Zeitpunkt ist der Typ test immer noch unvollständig. Wenn wir versucht hätten, die Operation sizeof(test) auszuführen, hätte der Compiler es versäumt, uns mitzuteilen, dass der Typ unvollständig ist. Und dennoch ruft das Aufrufen einer Vorlage, in der der Typ dieselbe genaue Operation ausführt, in g ++, clang ++, comeau und Visual Studio 2010 zusammen.

Stimmt der vorherige Code wirklich? Wo im Standard wird unterstützt, dass der Typ, der als Argument für die Vorlage verwendet wird, als vollständig gilt, wenn er vollständig irgendwo in der gleichen Übersetzungseinheit ist? Oder wenn muss abgeschlossen sein?

    
David Rodríguez - dribeas 26.10.2011, 00:07
quelle

1 Antwort

1

Die Vorlage wird erst kompiliert, nachdem sie am Ende erweitert wurde (der Test ist zu diesem Zeitpunkt abgeschlossen).

    
MartyTPS 26.10.2011 07:52
quelle

Tags und Links