2013-02-25 18 views
5

Ho una funzionespostare semantica e struct

struct foo { 
    std::vector<int> v; 
}; 

foo func(); 

sarà il vettore all'interno foo essere spostato o copiato al ritorno dalla funzione?

+4

No, verrà spostato. –

+2

Dipende totalmente da cosa succede all'interno di 'func'. –

+0

@BoPersson Non proprio, poiché quella domanda riguarda il ritorno di un 'vector', mentre si tratta di restituire una struct con il costruttore di movimento di default e un membro' vector'. – delnan

risposta

5

Sarà spostato. (*)

Dal momento che non si fornisce un costruttore mossa esplicita per la classe foo, il compilatore implicitamente generarne una per te, che invoca il costruttore mossa (se disponibile) per tutti i membri della tua classe. Poiché std::vector definisce un costruttore di movimento, verrà richiamato.

Per Paragrafo 12.8/15 del C++ 11 standard:

Il costruttore di copia/spostamento implicitamente definito per un non-union classe X esegue una copia membro a membro/spostare delle sue basi e membri . [...]

Si noti inoltre che il compilatore può elidere la chiamata al costruttore copia/sposta della classe quando restituisce un oggetto in base al valore. Questa ottimizzazione è denominata (Named) Return Value Optimization.

(*) Suppongo qui che il tuo caso d'uso sia quello di creare un oggetto locale con memorizzazione automatica all'interno di foo() e restituirlo.

+0

Non verrà spostato se il 'pippo' restituito è forse un' pippo' con durata di memorizzazione statica. Probabilmente ci sono anche altri casi. Ma sì, sono d'accordo con te per il caso che il richiedente sta probabilmente chiedendo. –

+1

@sftrabbit: OK, è corretto. Supponevo che volesse restituire un oggetto locale con l'archiviazione automatica. Modificato, grazie. –

+0

@BoPersson: L'ho menzionato, anche se non RVO esplicitamente. Io lo farò. –