Anch'io ho trovato questo molto difficile da capire in un primo momento. Se pensi ai valori r come temporanei, le istanze senza nome aiuta. Ad esempio
functionCall( SomeObject{ 0 } );
In questo caso
SomeObject{ 0 }
è una chiamata al costruttore che crea un'istanza temporanea, senza nome, della classe SomeObject. Se fai la firma di
functionCall( SomeObject&& x )
quindi accetta solo oggetti temporanei senza nome.
Ora, una volta compreso questo, è necessario rendersi conto che un oggetto non temporaneo denominato può essere convertito in un valore R automaticamente dal compilatore o esplicitamente dal programmatore (std :: move).
Se sposti un oggetto con nome std::move( x )
allora x non può più essere utilizzato perché è "matto" (memoria) spostato.
L'uso principale per i valori r come funzionalità del linguaggio è quello di spostare gli oggetti dentro e fuori le funzioni senza copiare.