Ich bin auf ein interessantes variantes Template-Funktionsverhalten gestoßen. Kann jemand auf die relevanten Regeln im Standard hinweisen, die dies definieren?
GCC , ICC und MSVC kompilieren den folgenden Code erfolgreich (Clang nicht, aber ich verstehe, dass dies auf Compilerfehler zurückzuführen ist).
%Vor% In diesem Aufruf von foo
werden Vorlagenargumente für A
und Bs
bereitgestellt, dann wird C
zu int
abgeleitet.
Wenn wir jedoch einfach die letzten beiden Template-Parameter umdrehen:
%Vor%Dann alle drei Compiler werfen Fehler. Hier ist der vom GCC:
%Vor% Um die Dinge interessanter zu gestalten, ist der Aufruf mit nur vier Argumenten ungültig für die erste foo
und gültig für die Sekunde.
Es scheint, dass in der ersten Version von foo
, C
muss abgeleitet werden muss, während in der zweiten Version C
explizit angegeben werden muss
Welche Regeln im Standard definieren dieses Verhalten?
Wie so oft kam die Antwort einige Stunden nachdem ich die Frage gestellt hatte, zu mir.
Betrachten Sie die beiden Versionen von foo
:
und der folgende Aufruf (angenommen foo
ist foo1
oder foo2
):
Im Falle von foo1
werden die Vorlagenparameter wie folgt ausgewählt:
Aber im Fall von foo2
sehen sie so aus:
Bs
befindet sich in einem nicht-abgeleiteten Kontext ( [temp.deduct.type]/5.7
), daher können keine weiteren Funktionsargumente zur Erweiterung des Pakets verwendet werden. Daher müssen in foo2
alle Template-Argumente explizit angegeben werden.
Tags und Links c++ templates language-lawyer