2011-08-22 15 views

Odpowiedz

8

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 
+0

Wydawałoby się, że odczytanie wartości obiektu po przeniesieniu go to UB. Czy tak nie jest? –

+0

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

+0

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