Il riferimento a r si lega solo ai valori. Nel codice precedente, Other(std::string &&)
sarà non essere considerato. Quindi, solo il problema potrebbe essere se la funzione std::string &
ma spostata internamente.
L'unico modo per ottenere r -valore di l -valore è un std::move
. Quindi, se fai attenzione a non usare std::move
sull'argomento di funzione che hai ricevuto con l -valore di riferimento, non ci saranno sorprese.
Spostare qualcosa che hai ricevuto con l -valore di riferimento dovrebbe essere considerato un bug . Sfortunatamente le regole del linguaggio stesso non sono in grado di catturarlo, quindi è un lavoro per un controllore statico. Non so se qualcuno di questi lo faccia già.
Naturalmente una funzione che prende un riferimento di valore non-const l potrebbe sempre rovinare l'oggetto passato e lo spostamento aggiunge solo un altro modo per farlo, ma il problema esisteva già.
In generale, raccomanderei di evitare funzioni che assumono riferimenti a valori non const l , poiché le funzioni che modificano il loro argomento non sono mai particolarmente leggibili. Si prevede che un metodo modifichi il suo invocante (a meno che non sia un getter), ma la modifica di altri argomenti rende il flusso di dati più complicato e meno ovvio. In C ++ 11 move rende gli oggetti di ritorno efficienti quanto la modifica del riferimento e std::tuple
con std::tie
consente di restituire più valori, quindi la maggior parte degli usi della modifica degli argomenti può essere riscritta senza una significativa perdita di efficienza.
Come per l'uso corretto di std::move
, si noti che il modo più efficace per scrivere i setter che sono stati precedentemente scritti prendendo riferimento const e copiato da esso ora dovrebbe prendere per valore e spostarsi da esso. La costruzione dell'argomento nel chiamante si muoverà se possibile e copierà altrimenti.