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?
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?
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.
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. –
@sftrabbit: OK, è corretto. Supponevo che volesse restituire un oggetto locale con l'archiviazione automatica. Modificato, grazie. –
@BoPersson: L'ho menzionato, anche se non RVO esplicitamente. Io lo farò. –
No, verrà spostato. –
Dipende totalmente da cosa succede all'interno di 'func'. –
@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