Próbuję zrozumieć odniesienia rvalue
. Widziałem, jak są one wykorzystywane w konstruktorów, z rzeczy, jak std::move
i std::forward
, ale ja nadal nie rozumiem, dlaczego to nie działa:C++, odniesienia wartości r w parametrach funkcji
void func(string&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
I to robi:
template<typename T>
void func(T&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
Dlaczego działa z wersją szablonu funkcji?
Ta ostatnia wersja działa, ponieważ 'T' jest wydedukowana jako' string & '."Gdy typ parametru funkcji ma formę T && gdzie T jest parametrem szablonu, a argument funkcji jest lwartością typu A, typ A & jest używany do odliczenia argumentu szablonu." Użyj 'std :: move', jeśli chcesz by ten pierwszy działał. –
Jest to szczególny przypadek potrącenia szablonu, tutaj (i tylko tutaj AFAIK), "T" można wywnioskować na typ odniesienia. Zwykle w dedukcji typu szablonu "T" jest wydedukowane jedynie jako brak odniesienia. –
możliwy duplikat [Składni uniwersalnych odniesień] (http://stackoverflow.com/questions/14302849/syntax-for-universal-references) –