Heim >Backend-Entwicklung >C++ >Warum hat der Zeigerzerfall bei der C-Überladungsauflösung Vorrang vor abgeleiteten Vorlagen?
Zeigerzerfall vs. abgeleitete Vorlagen: Lösung des Prioritätsrätsels
Im Bereich von C kann das Zusammenspiel zwischen Funktionsüberladungen und Vorlagenabzug manchmal zu unerwarteten Ergebnissen führen. Ein Paradebeispiel entsteht, wenn eine Funktion überladen wird, um sowohl Arrays als auch Rohzeiger zu verarbeiten. Betrachten Sie den folgenden Code:
template <size_t N> void foo(const char (&s)[N]) { std::cout << "array, size=" << N - 1 << std::endl; } void foo(const char *s) { std::cout << "raw, size=" << strlen(s) << std::endl; }
Diese Funktion wurde ursprünglich zum Drucken der Länge eines Arrays entwickelt und wurde erweitert, um Nicht-Arrays zu unterstützen. Diese Erweiterung führt jedoch zu einer rätselhaften Mehrdeutigkeit:
foo("hello") // now prints raw, size=5
Warum wird die „rohe“ Überladung der beabsichtigten „Array“-Version vorgezogen, obwohl letztere den Parametern genauer entspricht? Die Antwort liegt in einem subtilen Konzept, das als Zeigerzerfall bekannt ist.
Zeigerzerfall ist eine implizite Konvertierung von einem Array in seinen entsprechenden Zeiger. In diesem Fall wird das Array „hello“ stillschweigend in einen const char * Zeiger auf sein erstes Element umgewandelt. Daher hat die Überlastung, die Zeiger verarbeitet, Vorrang.
Dieses Verhalten ist auf die Kosten für Konvertierungen in C zurückzuführen. Überladungen werden ausgewertet, um die Kosten für die Konvertierung von Argumenten in Parameter zu minimieren. In diesem Fall ist die Array-zu-Zeiger-Konvertierung kostengünstiger als eine Array-zu-Funktionsparameter-Konvertierung.
Um dieses Problem zu umgehen, kann man die zweite Überladung auch als Vorlage definieren:
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; }
Dieser Ansatz stellt sicher, dass die Vorlagenversion bevorzugt wird, da die Konvertierung des Zeigerabfalls eliminiert wird.
Zusammenfassend lässt sich sagen, dass dem Zeigerabfall Vorrang vor abgeleiteten Vorlagen eingeräumt wird ist eine Folge des Kostenminimierungsprinzips bei der Überlastlösung. Um Unklarheiten zu vermeiden, ist es wichtig, beim Überladen von Funktionen sowohl implizite Konvertierungen als auch die Arten von Überladungen zu berücksichtigen.
Das obige ist der detaillierte Inhalt vonWarum hat der Zeigerzerfall bei der C-Überladungsauflösung Vorrang vor abgeleiteten Vorlagen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!