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);
}
Ich konnte nicht verstehen "Sie haben Recht, wenn Sie sagen, dass beide ein genaues Match sind" Wie? –
@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
@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 **. –