By defining the move assignment operator, you disabled the move constructor due to the rule of 5. The class isn't is_nothrow_move_constructible
because it isn't move constructable at all, that constructor is no longer available unless you define it.
§12.8 Copying and moving class objects
If the definition of a class X
does not explicitly declare a move constructor, one will be implicitly declared as defaulted if and only if
— X
does not have a user-declared copy constructor,
— X
does not have a user-declared copy assignment operator,
— X
does not have a user-declared move assignment operator,
— X
does not have a user-declared destructor, and
— the move constructor would not be implicitly defined as deleted.
In the case where you had no user-defined move constructor, both were implicitly defined and followed the below specification.
§15.4 Exception specifications
An implicitly declared special member function shall have an exception-specification. If f
is an implicitly declared default constructor, copy constructor, move constructor, destructor, copy assignment operator, or move assignment operator, its implicit exception-specification specifies the type-id T
if and only if T
is allowed by the exception-specification of a function directly invoked by f
’s implicit definition; f
shall allow all exceptions if any function it directly invokes allows all exceptions, and f
shall allow no exceptions if every function it directly invokes allows no exceptions.