2013-02-21 17 views
24

Il seguente codice viene compilato ed eseguito su MSVC2010, dovrebbe?Dovrebbe essere std :: move drop constness?

const std::string s = "foo"; 
std::string s2(std::move(s)); 

Posso capire perché questo probabilmente non sarebbe rompere nulla da quando se prendo interni di s devo sapere che nessuno ha intenzione di usarlo in modo che dosn't questione che sto cadere const. Tuttavia, per quanto riguarda dove il compilatore implementa gli oggetti const nella ROM (in un'applicazione incorporata)? La mossa diventerebbe allora una copia? O MSVC dovrebbe darmi un errore?

+0

forse si compila a causa di qualche ottimizzazione? – SomeWittyUsername

+2

@icepack no, la compilazione, in particolare i controlli sulla correttezza const, ecc., Si presentano prima dell'ottimizzazione. –

+1

@icepack la regola d'oro dell'ottimizzazione è la regola as-if. Il compilatore non può fare ottimizzazioni che non si comportano come se non fossero applicate (in termini di comportamento osservabile e all'interno delle regole sul linguaggio). –

risposta

29

Penso che std::move(T const&) restituisca appena T const &&. Ciò significa che non verrà effettivamente spostato da (poiché gli operatori/i costruttori di assegnazione movimento non corrispondono al tipo param).

ciò che accade è, che il costruttore prendendo T const& corrisponde al lvalue (la variabile digitato T const &&) e, come tale, la mossa degrada in una copia.

+3

@AndyProwl sembra che ogni volta che chiedo qualcosa qui sei lì per rispondere :) sei come la forma nerd di un angelo custode;) – odinthenerd

+1

@PorkyBrain: Sembra così sbagliato: D –

+0

Penso che la seconda frase sia un po 'fuorviante . Parametri di riferimento Lvalue * mai * corrisponde a riferimenti rvalue, ma un riferimento temporaneo può essere associato a un riferimento const-lvalue ... –

23

Questa è alcuna differenza per

const std::string f() { return "foo"; } 
std::string s2 = f(); 

Questo è stato, un tempo, consigliato C++ 03, e il comitato non ha pausa questo codice quando l'introduzione riferimenti rvalue. Si degrada semplicemente in una copia.

+0

Bel confronto con una situazione di spostamento implicita. +1 – sehe

+1

+1 per motivazione –

+1

+1 troppo male Non riesco ad accettare più risposte – odinthenerd

Problemi correlati