Diese Frage wurde von Issue with std::reference_wrapper inspiriert. Beispiel: operator<
für std::vector
. Es wird als eine Funktionsschablone definiert alsWarum Standardcontainer Funktionsschablonen anstelle von Nicht-Vorlage-Koenig-Operatoren verwenden
template< class T, class Alloc >
bool operator<(const vector<T,Alloc>& lhs,
const vector<T,Alloc>& rhs);
Als Ergebnis implizite Umwandlung von Funktionsargument an den Typ des entsprechenden Funktionsparameter verweigert wird (im Allgemeinen wegen seiner Vorlage Natur). Dies reduziert die Nützlichkeit und den Komfort von std::reference_wrapper
erheblich. Zum Beispiel können Sie std::sort
unter std::vector<std::reference_wrapper<std::vector<int>>>
nicht verwenden.
Auf der anderen Seite, alle Probleme sind nur zu lösen, wenn operator<
als Nicht-Template-Koenig Operator wie
template <...>
class vector ... {
friend bool operator<(const vector& a, const vector& b) {...}
};
warum ich frage mich, definiert der Standard-Bibliothek der ehemaligen Ansatz statt dessen angenommen hat ?
@jxh Der entscheidende Unterschied zwischen den beiden ist: Eine ist eine Vorlage, die implizite Konvertierung effektiv verbietet, während die andere nicht, erlaubt implizite Konvertierung. – Lingxi
Nun, zu der Zeit, dass 'Operator <' genormt wurde, existierte 'reference_wrapper' nicht, AFAIK. –
Über den Wortlaut: Es gibt keine Koenig-Betreiber. Es gibt stattdessen Funktionen, die durch ADL/Koenig-Lookup gefunden werden. – edmz