Ist es mißbräuchlich, Parameter der Elternvorlage abzuleiten, wenn der Zeiger auf die Funktion consxpr im Gültigkeitsbereich einer Klasse übergeben wird?

8

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:

%Vor%

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?

    
W.F. 17.12.2017, 11:45
quelle

1 Antwort

6

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.

    
StoryTeller 17.12.2017, 12:18
quelle