Questa domanda è ispirata allo Issue with std::reference_wrapper. Diciamo, ad esempio, operator<
per std::vector
. E 'definita come modello funzionePerché i contenitori standard utilizzano i modelli di funzione anziché gli operatori Koenig non modello
template< class T, class Alloc >
bool operator<(const vector<T,Alloc>& lhs,
const vector<T,Alloc>& rhs);
Di conseguenza, conversione implicita di funzione argomento nel tipo di parametro funzione corrispondente viene negato (sostanzialmente a causa della sua natura template). Ciò riduce notevolmente l'utilità e la convenienza di std::reference_wrapper
. Ad esempio, non è possibile utilizzare std::sort
su std::vector<std::reference_wrapper<std::vector<int>>>
.
D'altra parte, tutti i problemi sono risolti solo se operator<
è definito come un non-modello di operatore Koenig come
template <...>
class vector ... {
friend bool operator<(const vector& a, const vector& b) {...}
};
mi chiedo il motivo per cui la libreria standard ha adottato il primo approccio al posto di questo ?
@jxh La differenza cruciale tra i due è: uno è un modello, che vieta effettivamente la conversione implicita, mentre l'altro non lo è, consentendo la conversione implicita. – Lingxi
Bene, nel momento in cui l'operatore <'è stato standardizzato,' reference_wrapper' non esisteva, AFAIK. –
Informazioni sulla parola: non ci sono operatori Koenig. Ci sono, invece, funzioni che vengono trovate dalla ricerca ADL/Koenig. – edmz