Questo semplicemente si allinea con quello che ci aspettiamo, in generale, dal tipo di modello deduzione:
template <class T> void vfoo(T);
template <class T> void lfoo(T&);
template <class T> void cfoo(T const&);
template <class T> void ffoo(T&&);
std::string x;
vfoo(x); // deduce T = std::string
lfoo(x); // deduce T = std::string
cfoo(x); // deduce T = std::string
ffoo(x); // deduce T = std::string& !
ffoo(std::move(x)); // deduce T = std::string
Da the original paper, sottolineatura mia:
Quando dedurre un tipo di modello di funzione con una corrispondenza argomento lvalue a un riferimento di rvalue, il tipo è dedotto come un tipo di riferimento di lvalue. Quando viene fornita una deduzione per argomento rvalue, la detrazione di tipo procede esattamente come con altri tipi.
E 'il caso detrazione lvalue che è l'unica eccezione, che è il motivo per cui si ottiene una frase in più nelle regole di deduzione tipo. Il caso limite è tipico: si allinea con il semplice modello mentale di incollare nei tipi dedotti per vedere quale funzione si finisce. Chiamato T&&
con un std::string
? Ottieni T = std::string
in modo che l'argomento sia std::string&&
. Dai un'occhiata.
L'ultima frase è sbagliata. 'modello void foo (T)' non dedurrà mai un tipo di riferimento. –
Oktalist
@Oktalist hai ragione - l'ho rimosso. – Pete