Se você definir o operador de atribuição para aceitar um valor, não deve (não precisar e não pode) definir o operador de atribuição que toma uma referência RValue. Não faz sentido isso.
Em geral, você só precisa fornecer uma sobrecarga de uma referência de RValue quando precisa diferenciar um LValue de um RValue, mas, neste caso, sua escolha de implementação significa que você não precisa fazer essa distinção. Se você tem um LValue ou um Rvalue, criará o argumento e trocará o conteúdo.
String f();
String a;
a = f(); // with String& operator=(String)
Nesse caso, o compilador resolverá a chamada para ser a.operator=(f());
ele perceberá que a única razão para o valor de retorno é ser o argumento para operator=
E eliminará qualquer cópia -esse é o sentido de fazer a função assumir um valor em primeiro lugar!