Si define el operador de asignación para que tome un valor, no debe (no necesita y no puede) definir el operador de asignación que toma una referencia de RValue. No tiene sentido.
En general, solo necesita proporcionar una sobrecarga que tome una referencia de RValue cuando necesita diferenciar un LValue de un rValue, pero en este caso su elección de implementación significa que no necesita hacer esa distinción. Ya sea que tenga un Lvalue o un Rvalue, creará el argumento e intercambiará el contenido.
String f();
String a;
a = f(); // with String& operator=(String)
En este caso, el compilador resolverá la llamada para ser a.operator=(f());
se dará cuenta de que la única razón del valor de retorno es ser el argumento para operator=
Y elirá cualquier copia, ¡este es el punto de hacer que la función tome un valor en primer lugar!