Warum ruft die folgende Überladungsauflösung die Nicht-Template-Funktion auf? [Duplikat]

8

Warum führt die Überladungsauflösung für den Aufruf max(x, y) im unten angegebenen Ausdruck return max(max(x, y), z); zu einem Aufruf der Nicht-Template-Funktion char const* max(char const*, char const*) ?

Soweit ich das verstehe, ist die Funktion max<const char*>(x, y) besser geeignet als die erste, da x eine const char* const& und y eine const char* const& !

ist %Vor%     
Belloc 23.03.2013, 12:01
quelle

2 Antworten

4
  

Warum führt die Überladungsauflösung für den Aufruf max(x, y) im unten angegebenen Ausdruck return max(max(x, y), z); zu einem Aufruf der Nicht-Template-Funktion char const* max(char const*, char const*) ?

Beim Aufruf dieser Funktion:

%Vor%

T wird zu const char* abgeleitet. Daher wird diese Signatur instanziiert:

%Vor%

Die Funktion ruft intern die binäre Version von max() mit Argumenten vom Typ const char* auf. Sowohl die Template- als auch die Nicht-Template-Überladung sind für ein Argument vom Typ const char* geeignet.

Wenn jedoch zwei Funktionen zum Auflösen des Aufrufs geeignet sind und einer von ihnen keine Vorlage ist, wird die Nicht-Template-Version als beste Lösung betrachtet . p>

Gemäß Paragraph 13.3.3 / 1 des C ++ 11 Standards:

  

Angesichts dieser Definitionen ** ist eine lebensfähige Funktion F1 als eine bessere Funktion definiert als eine andere lebensfähige Funktion   F2 wenn ** für alle Argumente i, ICSi (F1) keine schlechtere Konvertierungssequenz als ICSi (F2) und dann

ist      

- für ein Argument j ist ICSj (F1) eine bessere Konvertierungssequenz als ICSj (F2) oder, falls nicht,

     

- Der Kontext ist eine Initialisierung durch benutzerdefinierte Konvertierung (siehe 8.5, 13.3.1.5 und 13.3.1.6) und die   Standardkonvertierungssequenz vom Rückgabetyp von F1 zum Zieltyp (d. h. der Typ des   Entität wird initialisiert) ist eine bessere Konvertierungssequenz als die Standardkonvertierungssequenz von   der Rückgabetyp von F2 zum Zieltyp. [...] oder wenn nicht,

     

- F1 ist eine Nicht-Template-Funktion und F2 ist eine Funktion Template-Spezialisierung oder, wenn nicht das,

     

- F1 und F2 sind Spezialisierungen für Funktionsvorlagen und die Funktionsvorlage für F1 ist spezieller   als die Vorlage für F2 gemäß den in 14.5.6.2 beschriebenen Teilordnungsregeln.

Dies erklärt, warum die Nicht-Template-Überladung ausgewählt wurde.

    
Andy Prowl 23.03.2013, 12:05
quelle
0

Argument Matching - Überladene Funktionen sind für die ausgewählt beste Übereinstimmung von Funktionsdeklarationen im aktuellen Bereich.

  

Wenn die Schablonenargumentableitung erfolgreich ist, dann die generierte Funktion   wird mit den anderen Funktionen verglichen, um die beste Übereinstimmung zu bestimmen,   Befolgen Sie die Regeln für die Überladungsauflösung

  
  • Eine genaue Übereinstimmung wurde gefunden.

  •   
  • Eine triviale Konvertierung wurde durchgeführt.

  •   
  • Es wurde eine integrale Werbung durchgeführt.

  •   
  • Eine Standardkonvertierung zum gewünschten Argumenttyp existiert.

  •   
  • Eine benutzerdefinierte Konvertierung (entweder Konvertierungsoperator oder Konstruktor) in den gewünschten Argumenttyp existiert.

  •   
  • Es wurden Argumente gefunden, die durch eine Ellipse dargestellt werden.

  •   
    
deepmax 23.03.2013 12:06
quelle

Tags und Links