Heim > Backend-Entwicklung > C++ > Hauptteil

Warum hat eine „const char*'-Funktionsüberladung Vorrang vor einer „const char (&)[N]'-Vorlagenfunktion?

Mary-Kate Olsen
Freigeben: 2024-11-26 18:04:08
Original
645 Leute haben es durchsucht

Why Does a `const char*` Function Overload Prevail Over a `const char (&)[N]` Template Function?

Überladungskonflikte: Pointer Decay vs. Template Deduction

Frage:

Warum funktioniert eine Funktion mit einem Parameter vom Typ const char* haben Vorrang vor einer Funktionsvorlage mit einem Parameter vom Typ const char (&s)[N], wenn beides der Fall ist gleichermaßen anwendbar?

Grundursache:

Die Unklarheit ergibt sich aus den relativen Kosten der Konvertierungen. Die Überlastungsauflösung begünstigt Funktionen, die weniger Konvertierungsvorgänge erfordern. Ein Array ist praktisch ein Zeiger auf sein erstes Element, was bedeutet, dass die Array-zu-Zeiger-Konvertierung weniger kostet als die Deklaration einer Array-basierten Funktionsvorlage.

Standarderklärung:

Gemäß dem C-Standard ([over.match.best]/(1.3), (1.6)):

  • Nicht-spezialisierte Funktionen werden gegenüber spezialisierten Funktionsvorlagen bevorzugt.
  • Wenn zwei Konvertierungen den gleichen Rang haben, sind sie nicht unterscheidbar.

In diesem Fall:

  • Die Konvertierung von einem Array in einen Zeiger ist eine L-Wert-Transformation mit Exakter Übereinstimmungsrang.
  • Mit Ausnahme von L-Wert-Transformationen ist der Konvertierungsrang nicht signifikant.
  • Daher ist keine der Konvertierungssequenzen besser, was zu Mehrdeutigkeiten und einer Auswahl der char const*-Überladung führt.

Mögliche Problemumgehung:

Um Prioritäten zu setzen Wenn Sie eine vorlagenbasierte Funktion verwenden, definieren Sie auch die zweite Überladung als Funktionsvorlage:

template <typename T>
auto foo(T s)
    -> std::enable_if_t<std::is_convertible<T, char const*>{}>
{
    std::cout << "raw, size=" << std::strlen(s) << std::endl;
}
Nach dem Login kopieren

Diese Teilreihenfolge stellt sicher, dass die vorlagenbasierte Funktion ausgewählt wird, wenn zutreffend.

Das obige ist der detaillierte Inhalt vonWarum hat eine „const char*'-Funktionsüberladung Vorrang vor einer „const char (&)[N]'-Vorlagenfunktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage