Despite being deleted, the operators on lines 31 and 32 still participate in overload resolution.
That is, counter-intuitively, the compiler still considers them for the purpose of trying to determine what operator the operations on lines 40 and 41 are using. Hence, the ambiguity: for line 40, two of those three operators are viable. For line 41, all three are viable.
Line 18 declares a valid copy assignment operator using the copy-and-swap idiom. Therefore, the compiler isn't going to implicitly generate its own copy assignment operator for your class.
As for the move assignment operator, one of the requirements for it to be implicitly generated is that the class doesn't have a user-written copy assignment operator (which it does).
And yes, this means the statement on line 41 uses that copy assignment operator.
@TheToaster, despite the name "std::move", the function doesn't perform a move. It performs a cast that matches a move constructor or assignment operator.
It doesn't force a move, just makes it "work" when the recipient (the lvalue "t" in your example) can accept it as a move.