Preconditions: If D is not a reference type, D meets the
Cpp17MoveAssignable requirements (Table 33) and assignment
of the deleter from an rvalue of type D does not throw an exception.
Otherwise, D is a reference type;
remove_reference_t<D> meets the Cpp17CopyAssignable
requirements and assignment of the deleter from an
lvalue of type D does not throw an exception.