Entrambi std::forward
e std::move
non sono altro che calchi.
X x;
std::move(x);
Quanto sopra getta l'espressione lvalue x
di tipo X per un'espressione rvalue di tipo X (a xValue per essere esatti). move
può anche accettare un rvalue:
std::move(make_X());
e in questo caso si tratta di una funzione identità: prende un rvalue di tipo X e restituisce un rvalue di tipo X.
Con std::forward
è possibile selezionare la destinazione certa misura:
X x;
std::forward<Y>(x);
proietta l'espressione lvalue x
di tipo X per un'espressione di tipo Y. Esistono restrizioni sulla quale Y può essere.
Y può essere una Base accessibile di X, o un riferimento a una Base di X. Y può essere X o un riferimento a X. Non è possibile scartare qualificatori di cv con forward
, ma si può aggiungere cv- qualificazioni. Y non può essere un tipo che è semplicemente convertibile da X, tranne tramite una conversione Base accessibile.
Se Y è un riferimento lvalue, il risultato sarà un'espressione lvalue. Se Y non è un riferimento di lvalue, il risultato sarà un'espressione di valore di rvalue (xvalue per la precisione).
forward
può accettare un argomento di rvalue solo se Y non è un riferimento di lvalue. Cioè, non puoi lanciare un valore per lvalue. Questo è per motivi di sicurezza, in quanto in questo modo si ottengono riferimenti ciondolanti. Ma lanciare un valore per rvalue è ok e permesso.
Se si tenta di specificare Y su qualcosa che non è consentito, l'errore verrà rilevato in fase di compilazione, non in fase di esecuzione.
fonte
2012-03-12 17:52:06
Vedere anche queste due domande correlate: [Devo usare std :: move o std :: inoltra in move ctors/assignment operator?] (Http://stackoverflow.com/q/8860233/500104) e [Come funziona std :: forward work?] (http://stackoverflow.com/q/8526598/500104) (come pure la domanda duplicata). – Xeo
"Come pensarci facilmente e quando usare quale" Si usa 'move' quando si desidera * spostare * un valore, e' forward' quando si desidera utilizzare l'inoltro perfetto. Qui non è una scienza missilistica;) –
move() esegui cast incondizionato dove forward() esegue cast in base al parametro passato. –