Le cose con un nome sono lvalue. Ciò significa che nel corpo della funzione, t
è un lvalue. Non importa se il riferimento universale finisce come riferimento di lvalue o come riferimento di rvalore. Se è nominato, è un lvalue.
Se si passa quindi che l'argomento lungo direttamente, si passerà un lvalue.
In una situazione in cui si desidera passare solo lungo un argomento opaco per un'altra funzione, si desidera passare esattamente così com'è. Se era un lvalue, vuoi passarlo come un lvalue; se era un valore massimo, si vuole passare un valore. Come spiegato, passandolo direttamente lo passa come un lvalue sempre. forward
fa la magia necessaria per passarlo come il giusto tipo di valore,
Il codice che passa sempre un lvalue probabilmente risentirà di una prospettiva delle prestazioni, ma direi che puoi ignorarlo quando pensi a questo particolare problema. C'è una preoccupazione più pressante per non sempre passando un lvalue: durante la copia di alcuni tipi può essere costoso, alcuni altri tipi non possono essere copiati affatto, come std::unique_ptr
. Per quei tipi che preservano la rudimentalità quando l'inoltro non è una questione di prestazioni, ma di ottenere anche la compilazione del codice.
fonte
2014-04-25 09:57:24
Molto buon punto, ma non chiaramente rispondere alla domanda "che tipo di problema si può verificare se std :: avanti non viene utilizzato?" – Nicolas
+1, ma perché sarebbe sbagliato usare 'std :: forward' per' action'? Ho appena letto questo: [Perché utilizzare un valore perfettamente inoltrato?] (Http://stackoverflow.com/q/24779910/873025), e sembra che tu possa buttare via un'opportunità di ottimizzazione se non preservare la r-valueness. – Snps
@Snps: al contrario di 'std :: apply', il codice sopra riportato contiene un ciclo. A seconda del tipo di 'Azione',' std :: forward (action) 'può essere uguale a' std :: move (action) '. Ciò significa che con 'std :: forward' si cambierebbe potenzialmente l'azione' azione' nella prima iterazione e si causerebbe un comportamento strano per tutte le iterazioni rimanenti. –
nosid