Есть известный паттерн проверки присваивания и перемещения объекта себе:
operator=(A const& a) { if (this == &a) return *this; ...
operator=(A&& a) { if (this == &a) return *this; ...
Рекомендации от CppCoreGuidelines советуют не проверять, однако код при этом должен работать как ожидается
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c62-make-copy-assignment-safe-for-self-assignment
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c64-a-move-operation-should-move-and-leave-its-source-in-a-valid-state
А что делаете сегодня вы ?