Попаднах на следния кодов фрагмент
std::string&& test()
{
std::string m="Hello";
return (std::move(m));
}
int main()
{
std::string&& m = test();
}
Разбирам, че горният код е неправилен и опасен, но не знам защо. Засега това е моето разбиране за кода. Във функцията test
в стека се създава локална
std::string
променлива, нареченаm
.След това този низ се връща, но вместо да се прави копие, съдържанието му се премества във временния. В този момент функцията
test
завършва с извикване на деструктора на променливаm
(чието съдържание е преместено във временния)Временният вече е обвързан с препратката към rvalue
m
. И от това, което разбирам е, че временното ще остане живо, докато обвързващият му обект е жив и в обхват.
Може ли някой да ми каже къде може да греша? Защо кодът по-горе не е безопасен?