Passende Aliasvorlage als Vorlageargument

8

Betrachten Sie den folgenden Code :

%Vor%

Warum schlägt (2), d. h. static_assert , das die Aliasvorlage verwendet, fehl?

Wie unterscheidet sich der Template-Argument-Deduktionsprozess in (2) von dem in (1)?

    
Igor R. 25.04.2017, 19:13
quelle

2 Antworten

6

Dies ist CWG-Problem 1286 . Die Frage ist: sind alias und test gleichwertig? Es gab ein Beispiel in [temp.type], das andeutete, dass y und z hier denselben Typ haben:

%Vor%

Das Beispiel wurde als Teil von CWG-Fehler 1244 korrigiert - was angezeigt wurde richtigerweise, dass es in [temp.alias] keine Formulierung gibt, die angibt, dass Alias-Vorlagen den Vorlagen entsprechen sie alias. Die einzige Formulierung bezieht sich auf die Äquivalenz von Alias-Vorlagen-Spezialisierungen:

  

Wenn eine Template-ID auf die Spezialisierung einer Alias-Vorlage verweist, entspricht sie dem zugehörigen Typ, der durch Ersetzen ihrer Template-Argumente für die Template-Parameter in der -Typ-ID der Alias-Vorlage.

Die Absicht ist offensichtlich, dass y und z do in diesem Beispiel den gleichen Typ haben, was bedeutet, dass Z und Y tatsächlich äquivalent sind. Aber solange der Wortlaut der Entschließung nicht angenommen wird, sind sie es nicht. Heute sind alias und test nicht äquivalent, aber alias<int> und test<int> sind . Dies bedeutet, dass is_specialization_of<alias, alias<int>> ist is_specialization_of<alias, test<int>> , wobei alias eindeutig von test ist, was nicht zu Ihrer Teilspezialisierung passt und somit false_type ist.

Darüber hinaus sind test und alias auch bei der Übernahme des Wortlauts in # 1286 aus dem offensichtlichen Grund, dass test zwei Template-Parameter akzeptiert und alias einen übernimmt, immer noch nicht gleichwertig Vorlagenparameter. Das Beispiel in der Auflösungsformulierung entspricht Ihrem Beispiel und verdeutlicht die Absicht hier:

%Vor%
    
Barry 26.04.2017, 13:54
quelle
2

Ich denke, dass der Name der Alias-Vorlage ohne Liste der Template-Argumente nicht dem Namen des zugeordneten Typs entspricht. Weil Standard nur eine solche Situation angibt:

  

14.5.7 Aliasvorlagen [temp.alias]

     
  1. Wenn sich eine Vorlagen-ID auf die Spezialisierung einer Alias-Vorlage bezieht, entspricht sie dem zugehörigen Typ   erhalten durch Substitution seiner Template-Argumente für die Template-Parameter in der Type-ID des Alias   Vorlage. [Hinweis: Ein Alias-Vorlagenname wird niemals abgeleitet.-Endnote]
  2.   

und das funktioniert gut :

%Vor%     
VTT 25.04.2017 19:39
quelle