Ma perché C++ non consente il riferimento di riferimenti ai valori degli oggetti lvalue vincolanti?
Supponendo che vuoi dire "Perché non C++ consentono vincolante riferimenti rvalue a lvalue oggetti": lo fa. Semplicemente non è automatico, quindi devi usare std::move
per renderlo esplicito.
Perché? Perché altrimenti una chiamata di funzione innocua può sorprendentemente distruggere qualcosa che non mi aspettavo che:
Class object(much,state,many,members,wow);
looks_safe_to_me(object);
// oh no, it destructively copied my object!
vs.
Class object(much,state,many,members,wow);
obviously_destructive(std::move(object));
// same result, but now the destruction is explicit and expected
Una nota sulla duplicazione distruttiva: perché dico distruttivo e distruzione precedente, non intendo che il distruttore dell'oggetto termini la sua durata: solo che il suo stato interno è stato spostato in una nuova istanza. È ancora un oggetto valido, ma non mantiene più lo stesso costoso stato a cui era abituato.
Una nota sulla terminologia: vediamo se siamo in grado di chiarire l'uso impreciso del lvalue, rvalue ecc sopra.
citando cppreference per i posteri:
Così che effettivamente accade:
- esiste un oggetto
- l'oggetto è identificato localmente da un lvalue, da cui non è possibile spostare (per proteggerci dagli effetti collaterali imprevisti)
std::move
cede un'espressione xValue (che può essere spostato da) riferimento allo stesso oggetto come espressione lvalue
- significa oggetti come variabili (che prendono il nome da espressioni lvalue) non può essere implicitamente spostato da e deve invece esplicitamente spostato da tramite un'espressione xvalue esplicita come
std::move
.
- provvisori anonimi sono probabilmente già indicati con espressioni prvalue, e possono essere spostati in modo implicito
Stai chiedendo perché non riesci a "svuotare foo (vector & bar) {} foo (crea qui il vettore temporaneo)?"? – NathanOliver
Conosci 'std :: move'? – Jarod42