If you define the assignment operator to take a value, you should not (need not and cannot) define the assignment operator taking an rvalue-reference. There is no point to it.
In general, you only need to provide an overload taking an rvalue-reference when you need to differentiate an lvalue from an rvalue, but in this case your choice of implementation means that you don't need to make that distinction. Whether you have an lvalue or an rvalue you are going to create the argument and swap the contents.
String f();
String a;
a = f(); // with String& operator=(String)
In this case, the compiler will resolve the call to be a.operator=(f());
it will realize that the only reason for the return value is being the argument to operator=
and will elide any copy --this is the point of making the function take a value in the first place!