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.