Se si definisce l'operatore di assegnazione per assumere un valore, non è necessario (non è necessario e non puoi) definire l'operatore di assegnazione che assume una riferimento RValue. Non ha senso.
In generale, devi solo fornire un sovraccarico che assume una riferimento per il rValue quando è necessario differenziare un lValue da un rValue, ma in questo caso la tua scelta di implementazione significa che non è necessario fare tale distinzione. Che tu abbia un LVALUE o un RVALUE, stai per creare l'argomento e scambiare il contenuto.
String f();
String a;
a = f(); // with String& operator=(String)
In questo caso, il compilatore risolverà la chiamata per essere a.operator=(f());
si renderà conto che l'unica ragione per il valore di ritorno è essere l'argomento operator=
E eliminerà qualsiasi copia: questo è il punto di far sì che la funzione prenda un valore in primo luogo!