One suggestion: instead of overload assignments, overload constructors: constructors with a single argument are used for implicit conversion.
Assignments are automatically don by a call to an implicit conversion.
Overload them only if you have a more efficient way to handle the assignment respect to the copy.
The only assignment you are required to overload is the one with homogeneous parameter.
class mystring
{
public:
mystring();
mystring(const char* literal);
mystring( .... );
~mystring();
void clear();
void swap(mystring& s);
mystring(const mystring& src);
mystring& operator=(mystring src)
{ if(&src != this) { clear(); swap(src); } return *this; }
mystring(mystring&& src);
mystring& operator=(mystring&& src)
{ if(this!=&src) { clear(); swap(src); } return *this; }
};