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)?
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 anscheinend, 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%
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]
- 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]
und das funktioniert gut :
%Vor%Tags und Links c++ c++11 templates language-lawyer