2016-08-12 3 views
9

Kann jemand erklären, warum die Überladungsauflösung die 2. Funktion wählt, anstatt einen mehrdeutigen Fehler zu melden. Wie auch immer, die zweite Funktion ist eine exakte Übereinstimmung, aber die erste wird einer Qualifizierungsumwandlung unterzogen (von char * nach const char *). Das Dokument aus http://en.cppreference.com/w/cpp/language/overload_resolution
besagt jedoch, dass die Qualifizierungsumwandlung ebenfalls eine exakte Übereinstimmung ist, und daher sollten beide Kandidaten die gleiche Rangordnung aufweisen.C++ - Funktion Überladen mit exakter Übereinstimmung

Jede Art der Standardkonvertierungssequenz ist eine von drei Reihen zugeordnet:

1) Exact Match: keine Konvertierung erforderlich, L-Wert-zu-R-Wert Umwandlung, Qualifizierungs-Konvertierung, Funktionszeiger Umwandlung, (da C + +17) benutzerdefinierte Umwandlung von Klassentyp zur selber Klasse

2) Promotion: Integral Förderung, Gleitkommazahlen Förderung

3) Umwandlung: Umwandlung integrale, Gleitkommazahlen Umwandlung Floating-Integral-Konvertierung, Zeigerkonvertierung, Zeiger-zu-Memb ER-Konvertierung, Konvertierung boolean, benutzerdefinierte Umwandlung einer abgeleiteten Klasse mit seiner Basis

void g(const char* x) 
{ 
    std::cout << "g(const char* x)" << std::endl; 
} 

void g(char* x) 
{ 
    std::cout << "g(char* x)" << std::endl; 
} 

void callg() 
{ 
    char a[] = "sample"; 
    g(a); 
} 

Antwort

8

Beide Funktionen benötigen ein Array-zu-Zeiger-Konvertierung, aber die erste erfordert eine zusätzliche Qualifikations Konvertierung.

Sie richtig sind zu sagen, dass beide sind ein Exact Match

[over.ics.scs]/3

[...] Der Rang einer Umwandlungsfolge wird unter Berücksichtigung bestimmt der Rang jeder Umwandlung in der Reihenfolge und der Rang einer Referenzbindung (13.3.3.1.4). Wenn einer davon einen Conversion-Rang hat, hat die Sequenz den Conversion-Rang; Wenn einer davon einen Promotion-Rang hat, hat die Sequenz den Promotion-Rang. Andernfalls hat die Sequenz den genauen Übereinstimmungsrang.

aber nach den Regeln in [over.ics.rank]/3,2

Standard-Umwandlungsfolge S1 ist eine bessere Conversion-Sequenz als Standard-Umwandlungsfolge S2 wenn

[... ]

(3.2.5) - S1 und S2 unterscheiden sich nur in ihrer Qualifizierungsumwandlung und ergeben ähnliche Typen T1 und T2 (4.4) bzw. die cv-qualification-Signatur vom Typ T1 ist eine echte Teilmenge der cv-Qualifikations-Signatur vom Typ T2.

Die gleiche Regel ist auf der Seite, die Sie unter „Ranking der impliziten Umwandlung Sequenzen“ verknüpft

3) Eine Standard-Umwandlungsfolge S1 ist besser als eine Standard-Konvertierungssequenz S2 wenn

[...]

]

f) oder, falls nicht, dass, S1 und S2 unterscheiden sich nur in der Ausbildung Umwandlung und die CV-Qualifikation des Ergebnisses der S1 ist eine Teilmenge der cv-Qualifikation des Ergebnisses der S2

+0

Ich konnte nicht verstehen "Sie haben Recht, wenn Sie sagen, dass beide ein genaues Match sind" Wie? –

+0

@GilsonPJ Die Ränge der erforderlichen Conversions (Array-to-Pointer und Qualifizierung) sind Exact Matches, also sind die gesamten Conversion-Sequenzen auch Exact Matches. – user657267

+0

@Gilson: Grundsätzlich sind beide Exact Matches und haben den gleichen Rang ... aber die spezielle Regel bezüglich der cv-Qualifikation übertrumpft das und gibt # 2 Priorität. Kurz gesagt: ** es ist nur **. –

0

In Überladungsauflösung werden T * und const T * als unterschiedliche Parametertypen betrachtet. [over.load] 13,1/(3.4):

Insbesondere für jeden Typ T, "Zeiger auf T", "Zeiger auf const T" und "Zeiger auf flüchtige T" distinct Parameter betrachtet werden Typen, wie "Bezug auf T", "Bezug auf const T" und "Bezug auf flüchtige T".