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)):
In diesem Fall:
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; }
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!