Mit den 3 folgenden Überladungen
%Vor%Ist das Folgende schlecht gebildet?
%Vor%Clang wählt Überladung # 2 aus, während gcc nicht kompiliert werden kann ( Demo )
Wenn Sie die Überladung # 1 entfernen, stimmen beide der Auswahl der Überladung # 2 ( Demo ) zu.
Beim Entfernen von Überladung # 2 wählt gcc die Überladung # 1 aus und das Klingeln kann nicht kompiliert werden ( Demo )
Gemäß [over.over] / 2 führen wir eine Template-Argumentableitung durch. Dies wird für alle drei Überladungen erfolgreich sein: in der ersten, behalten [temp.deduct.funcaddr] / 2 im Hinterkopf:
Ein Platzhaltertyp (7.1.7.4) im Rückgabetyp einer Funktionsvorlage ist ein nicht abgeleiteter Kontext. Wenn Vorlage Englisch: www.weisang.info/index.php?id=143&t...h=ddcdcdcdcd Für eine solche Funktion ist der Argumentabzug erfolgreich, der Rückgabetyp wird aus der Instanziierung des Funktionskörper.
Da der Abzug erfolgreich ist (da alle Template-Parameter explizit Argumente geliefert haben), wird der Rückgabetyp als int
abgeleitet. Im zweiten Fall ist der Abzug erfolgreich, da das Argument bereitgestellt wird, und im dritten Fall wird T
abgeleitet. †
Weiter zu Absatz 4 ,
Wenn mehr als eine Funktion ausgewählt ist, [...] beliebig Funktion Template-Spezialisierung
F1
wird eliminiert, wenn das Set enthält eine zweite Funktionsvorlagen-Spezialisierung, deren Funktionsvorlage ist Spezialisierter als die Funktionsvorlage vonF1
nach dem Teilordnungsregeln von 14.5.6.2. Nach solchen Eliminierungen , falls vorhanden, bleibt genau eine ausgewählte Funktion übrig.
Laut [temp.deduct.partial] / 3 sind die Funktionsvorlagen " Funktionstypen werden für die Teilbestellung verwendet. Wir können sofort sehen, dass die Funktionstypen Nr. 1 und Nr. 2 keine Template-Parameter enthalten, die am Abzug beteiligt sind, also über die Addition zu [temp.deduct.partial] / 4 eingeführt durch Kernproblem 1391 Auflösung, ihre entsprechenden P
s werden nicht verwendet, um die Reihenfolge zu bestimmen. @bogdan erklärte hier , warum diese Lösung problematisch ist. Die Quintessenz ist, dass die Reihenfolge nur eine Zweideutigkeit für # 1 und # 2 ergibt.
Das heißt, nach der derzeitigen (wahrscheinlich fehlerhaften) Formulierung ist die Umwandlung in allen Fällen schlecht ausgebildet. Wenn die partielle Reihenfolge für Paare von nicht abhängigen / deduzierenden Parametern festgelegt ist,
† [temp.deduct.type] / 8 Element 9 ( T()
), falls Sie neugierig waren.
Tags und Links c++ templates language-lawyer c++14 function-overloading