The note here isn't correct -- you do need to check for self-assignment, since the user may have cast an lvalue to an rvalue via std::move(), and end up performing self-assignment that way