Gli operatori di conversione del valore restituito dedotti sono un po 'strani. Ma l'idea di base è che si comporta come un parametro di funzione per scegliere quale viene utilizzato.
E quando si decide tra T&&
e T&
le T&
vittorie nelle regole di risoluzione del sovraccarico. Questo per consentire:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
lavorare. T&&
può corrispondere a un valore nominale, ma quando sono disponibili sia i valori limite di sovraccarico sia quelli di riferimento universali, è preferibile quello di valore superiore.
Il giusto set di operatori di conversione è probabilmente:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
o anche
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
per evitare che l'estensione della vita non riuscita ti morda.
3 I tipi utilizzati per determinare l'ordinamento dipendono dal contesto in cui viene eseguito l'ordinamento parziale:
[Omissis]
(3.2) Nel contesto di una chiamata a una funzione di conversione, vengono utilizzati i tipi restituiti dei modelli di funzione di conversione.
Che poi finisce a seconda delle regole "più specializzate" quando si selezionano i sovraccarichi:
(9.1) se il tipo dal modello di argomento era un riferimento lvalue e il tipo dal modello di parametro non lo era, il tipo di parametro non è considerato almeno specializzato come il tipo di argomento; altrimenti,
Quindi operator T&&
non è almeno così specializzato come operator T&
, nel frattempo nessun stato regola operator T&
non è almeno così specializzato come operator T&&
, quindi operator T&
è più specializzato di operator T&&
.
Modelli più specializzati vincono la risoluzione del sovraccarico su meno, tutto il resto è uguale.