Überladungsauflösung von Funktionsvorlagen, abhängige und nicht abhängige Parameter

Überladungsauflösung von Funktionsvorlagen, abhängige und nicht abhängige Parameter

Dies ist eine übliche Teilbestellung. Wir ersetzen eindeutige Typen in einer der Funktionsvorlagen und versuchen, die anderen davon abzuleiten. Machen Sie es in beide Richtungen und wenn der Abzug nur in eine Richtung gelingt, haben wir einen Auftrag. Wenn Sie die geheimnisvollen Regeln lesen möchten, siehe [temp.func.order] und [temp.deduct.partial].

Also hier,

  • Ersetzen von T1=U1, T2=U2 in den Funktionstyp der ersten Überladung erzeugt int f(U1, U2); Können wir T1 ableiten und T2 in der zweiten Überladung von diesem? Nein; beide befinden sich in nicht abgeleiteten Kontexten. Ergo schlägt der Abzug fehl.
  • Ersetzen von T1=U1, T2=U2 in die zweite Überladung erzeugt int f(id<U1>::type, id<U2>::type) (Dies wird im Definitionskontext durchgeführt, sodass wir nicht weiter in id einfügen können - vielleicht gibt es irgendwo eine Spezialisierung). Können wir die T1 ableiten und T2 in der ersten Überladung von diesem? Ja, indem Sie T1 = id<U1>::type ableiten und T2 = id<U2>::type . Abzug erfolgreich.

Da die Deduktion nur in einer Richtung erfolgreich ist – die Deduktion der ersten von der transformierten zweiten – ist die zweite spezialisierter als die erste und wird bevorzugt durch Überladungsauflösung ausgewählt.

Der Fall des Alias-Templates ändert nichts.

Diese Vorlagen sind weder gleichwertig noch funktional gleichwertig.


Das folgende func überlasten

ist spezialisierter als die folgende func überlasten

daher wird ersteres durch Überladungsauflösung ausgewählt.

(Alle folgenden ISO-Standardreferenzen beziehen sich auf N4659:März 2017 Post-Kona Working Draft/C++17 DIS)

Die teilweise Reihenfolge von G und F Überladungen von func unterliegt:

  • [Temp.Funktionsreihenfolge]/2, [Temp.Funktionsreihenfolge]/3 und [Temp.Funktionsreihenfolge]/4 und
  • [Temp.Abzug.Teil]/2 und [Temp.Abzug.Teil]/10.