Nie tak per se, ponieważ funkcja musi zmodyfikować zmienną a
za równoważne. Powiedział, że po inline i trochę trywialne optymalizacji wynik będzie taki sam:
int x = func(5);
// pseudo-inlined:
int __temp = 5; // the temporary created by binding 5 to int&&
__temp = 3; // a = 3;
int x = __temp; // return a;
// constant propagation:
int __temp = 5;
__temp = 3;
int x = 3;
// dead-code elimination:
int x = 3;
Uwaga wynik jest taki sam, jak w przypadku korzystania drugą definicję func
i inlined, tylko dlatego, że zmienna tymczasowa wasn” t użyte. To pokazuje, że te dwie funkcje nie są ogólnie równoważne:
int modifyme = 100;
int x = func(std::move(modifyme));
// modifyme must be 3, second function definition wouldn't do that
Wydawałoby się, że odczytanie wartości obiektu po przeniesieniu go to UB. Czy tak nie jest? –
Też tak myślałem - byłbym bardzo zaskoczony, gdyby tak nie było, chociaż dla typów pierwotnych pozostawianie samej wartości jest oczywiście najtańszą opcją (dla skomplikowanych typów nie mogą tego zrobić, chociaż myślę)? – Voo
Myślałem również, że będzie to UB, przynajmniej dla POD (bez destruktorów). Dla non-POD muszą oczywiście zostać zmienione, aby wszystkie wskaźniki mogły być ustawione na 0, więc destruktor niczego nie zrobi ... – Emil