Il mio modo di vedere è che se abbiamo avuto qualche riferimento rvalue x:
T&& x = ...;
e abbiamo chiamato qualche funzione utilizzando x come parametro:
f(x)
Abbiamo bisogno di qualche modo per dire a f se può o meno danneggiare x (o "assumere la proprietà di x" o "è l'ultimo client che usa x").
Un modo per progettare questo sarebbe quello di qualificare ogni chiamata:
f(yours_now(x)) // ok to damage
f(still_mine(x)) // dont damage
ed effettuare la chiamata non qualificata illegale.
Un altro modo sarebbe quello di rendere un modo di default:
O:
f(yours_now(x)) // ok to damage
f(x) // dont damage
o
f(x) // ok to damage
f(still_mine(x)) // dont damage
Quindi, se siamo d'accordo qualificazione di ogni utilizzo è troppo ingombrante e dovremmo predefinite in un modo, che è il migliore? Bene, guardiamo al costo di scegliere accidentalmente il valore predefinito in entrambi i casi:
Nel primo caso è stato corretto il danno, ma abbiamo accidentalmente detto che non lo era. In questo caso perdiamo le prestazioni perché è stata effettuata una copia non necessaria, ma a parte questo non è un grosso problema.
Nel secondo caso non era giusto danneggiare un oggetto, ma abbiamo accidentalmente detto che lo era.Ciò potrebbe causare un bug logico difficile da rilevare nel programma, dato che x è ora in uno stato danneggiato quando f restituisce, ma l'autore si aspettava che non lo fosse.
Quindi il primo caso è quello che è stato scelto perché è "più sicuro".
fonte
2013-01-16 08:24:00