Sto cercando di capire i riferimenti rvalue
. Ho visto come vengono utilizzati nei costruttori, con le cose come std::move
e std::forward
, ma io ancora non capisco perché questo non funziona:C++, riferimenti di rvalue nei parametri di funzione
void func(string&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
E questo lo fa:
template<typename T>
void func(T&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
Perché funziona con la versione del modello di funzione?
L'ultima versione funziona perché "T" viene dedotto come 'stringa &'."Quando il tipo di parametro della funzione è del formato T &&, dove T è un parametro del modello e l'argomento della funzione è un lvalue di tipo A, il tipo A viene utilizzato per la deduzione degli argomenti del modello." Usa 'std :: move' se vuoi che il primo funzioni. –
Questo è un caso speciale di deduzione di template, qui (e solo qui AFAIK), 'T' può essere dedotto a un tipo di riferimento. Normalmente nella deduzione del tipo di modello "T" è dedotta solo come non riferimento. –
possibile duplicato di [Sintassi per riferimenti universali] (http://stackoverflow.com/questions/14302849/syntax-for-universal-references) –