Minimales Beispiel, das ich bekommen habe, ist ein bisschen kompliziert:
%Vor% [gcc] kompiliert den Code ohne Probleme, [clang] beschwert sich über die Übereinstimmung von Parent
mit Kid
problem:
Um absurder zu werden, wenn wir den Code ein wenig ändern:
%Vor%[clang] kompiliert auch den Code. Also ... ist es ein Käfer oder fange ich an verrückt zu werden?
Clang hat recht mit dem Buchstaben des Gesetzes. Ja, Kid
wird von Parent
abgeleitet. Diese Beziehung kann jedoch erst hergestellt werden, wenn Kid
ein vollständig definierter Typ ist. Und nun, [class.mem] / 6 :
Eine Klasse wird als vollständig definierter Objekttyp betrachtet ([basic.types]) (oder vollständiger Typ) beim Schließen} des Klassenspezifizierers. Innerhalb der Klassenmember-Spezifikation, wird die Klasse als vollständig betrachtet Funktionskörper, Standardargumente, noexcept-specifiers und default Mitgliedsinitialisierer (einschließlich solcher Dinge in verschachtelten Klassen). Sonst wird es in seiner eigenen Klasse als unvollständig angesehen Mitgliedsspezifikation.
Wir sind im "anderen" Teil, den ich hervorgehoben habe. Obwohl es sich um Zeiger handelt, wird die Klasse noch nicht als definiert betrachtet, damit die Zeigerkonvertierung gültig ist. GCC ist übermäßig permissiv.
Tags und Links c++ language-lawyer incomplete-type constexpr template-deduction