Überladungsauflösung der Vorlagenfunktion mit Auto

8

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 )

    
Jarod42 16.12.2016, 01:25
quelle

1 Antwort

8

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 von F1 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,

  • Fall 1 und 3 sind mehrdeutig, weil für zwei nicht-abhängige Funktionstypen (die von # 1 und # 2) kein Ordnungspaar existiert.
  • das akzeptierende Verhalten in Fall 2 ist korrekt (wie erwartet).

[temp.deduct.type] / 8 Element 9 ( T() ), falls Sie neugierig waren.

    
Columbo 16.12.2016, 02:12
quelle