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?