In C++ 11 verrà restituita una variabile locale std::vector
?
Per una variabile locale, anche un parametro per valore, il compilatore deve sempre tentativo per spostarlo prima (se né il passaggio né la copia può essere tralasciata per qualsiasi motivo, anche se i criteri sono incontrato). Se non funziona, si cerca ancora una volta con una copia:
§12.8 [class.copy] p32
Quando i criteri per l'elisione di un'operazione di copia sono stati raggiunti o sarebbero soddisfatti, salvo per il fatto che l'oggetto di origine è un parametro di funzione, e l'oggetto da copiare è designato da un lvalue, la risoluzione di sovraccarico per selezionare il costruttore per la copia viene prima eseguita come se l'oggetto fosse designato da un valore.Se la risoluzione del sovraccarico non riesce, o se il tipo del primo parametro del costruttore selezionato non è un riferimento di valore al tipo dell'oggetto (possibilmente qualificato cv), viene eseguita nuovamente la risoluzione di sovraccarico, considerando l'oggetto come un lvalue. [Nota: Questa risoluzione di sovraccarico a due stadi deve essere eseguita indipendentemente dal fatto che si verifichi l'elisione della copia. Determina il costruttore da chiamare se elision non viene eseguito e il costruttore selezionato deve essere accessibile anche se la chiamata viene eliminata. -end note]
Cosa succede se quel vettore è un membro di una variabile locale invece di una variabile locale stessa?
Non si tenta di spostare un oggetto suboject, in quanto non soddisfa i criteri per copia elision. (Che è muto, IMHO, ma è così che è attualmente. Non credo che i due dovrebbero essere collegati, in quanto un oggetto secondario può benissimo essere spostato se è locale.)
Ovviamente restituendo una variabile globale sarà non essere spostato. In quali altri casi non verrà spostato?
Un riferimento non verrà ovviamente spostato. Oltre a questo, non posso davvero pensare ad altro.
Vedere anche [questa domanda] (http://stackoverflow.com/q/9532608/500104). – Xeo