2011-08-22 23 views

risposta

8

non così per sé, perché la funzione deve modificare la variabile a equivalente. Detto questo, dopo inlining e un po 'di ottimizzazione banale il risultato sarà lo stesso:

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; 

Nota il risultato è lo stesso come se si è utilizzato la seconda definizione di func e inline, solo perché la variabile temporanea wasn' usato Ciò dimostra che le due funzioni non sono equivalenti in generale:

int modifyme = 100; 
int x = func(std::move(modifyme)); 

// modifyme must be 3, second function definition wouldn't do that 
+0

Avrei pensato che leggere il valore di un oggetto dopo averlo spostato è UB. Non è questo il caso? –

+0

Anche questo pensiero - sarei estremamente sorpreso se questo non fosse il caso, anche se per i tipi primitivi lasciare solo il valore è l'opzione più economica ovviamente (per tipi complessi non possono farlo anche se penserei?) – Voo

+0

Pensavo anche che sarebbe stato UB, almeno per i POD (senza distruttori). Naturalmente per i non-POD devono essere cambiati in modo che tutti i puntatori possano essere impostati su 0 in modo che il distruttore non faccia nulla ... – Emil