Verblüffendes Verhalten des nicht nachlaufenden Parameterpakets

9

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?

    
TartanLlama 08.08.2016, 10:56
quelle

1 Antwort

2

Wie so oft kam die Antwort einige Stunden nachdem ich die Frage gestellt hatte, zu mir.

Betrachten Sie die beiden Versionen von foo :

%Vor%

und der folgende Aufruf (angenommen foo ist foo1 oder foo2 ):

%Vor%

Im Falle von foo1 werden die Vorlagenparameter wie folgt ausgewählt:

%Vor%

Aber im Fall von foo2 sehen sie so aus:

%Vor%

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.

    
TartanLlama 08.08.2016, 15:44
quelle

Tags und Links