Clang vs G ++ stimmt nicht mit der Anzahl der Argumente der Klassenvorlage und der Template-Template-Parameter-Deklaration überein

8

Im folgenden Beispiel ist Abstract eine Klassenvorlage, deren erster Parameter ein Typ ist, und der zweite Parameter ist eine andere Vorlage, die ein Bool mit einer beliebigen Anzahl von Argumenten verwendet.

%Vor%

Die Ausgaben von Clang und C ++ sind die folgenden:

Clang Ссылка

  

Fehler: Klassenvorlage teilweise Spezialisierung ist keine Spezialisierung   Vorlagenargument;

G ++ Ссылка

  

OK

Also entschied ich mich, klingfreundlich zu werden und fügte einen dritten Parameter in Abstract 's Deklaration hinzu.

%Vor%

Nun, sowohl Clang als auch G ++ waren damit einverstanden. Ich vermute, der Grund, warum Clang sich beschwert hat, war, dass die Spezialisierung nichts wirklich Spezialisiert hat. Das stimmt aber nicht. Es ist spezialisiert auf die Anzahl der Argumente.

Als Nächstes fügte ich eine weitere Spezialisierung für den Template-Vorlagenparameter hinzu. Das Beispiel sieht so aus:

%Vor%

Die Ausgaben von Clang und C ++ sind die folgenden:

Clang Ссылка

  

error: Neudefinition von Abstract<type-parameter-0-0, C, void> Hinweis: vorherige Definition ist struct Abstract<T,C> : Abstract<T>

G ++: Ссылка

  

OK - (hat auch den dritten Parameter in der Deklaration nicht benötigt)

Ich glaube nicht, dass Clang genau hier ist, weil die dritte Spezialisierung für das Template-Template-Argument gültig ist, und der Variadic-Template-Parameter erlaubt mir, mich auf eine beliebige Anzahl von Argumenten zu spezialisieren. Ich bin mir jedoch nicht sicher.

Frage: Welcher Compiler ist der Buggy? Warum? Es wäre wirklich nett, ein Zitat aus der Spezifikation und mehr Klarheit zu diesem Thema zu bekommen.

    
Constantinos Glynos 20.02.2018, 18:22
quelle

0 Antworten