Requires: If D is not a reference type, D shall satisfy the
Cpp17MoveAssignable requirements ([tab:moveassignable]Table *tab:moveassignable) and assignment
of the deleter from an rvalue of type D shall not throw an exception.
Otherwise, D is a reference type;
remove_reference_t<D> shall satisfy the Cpp17CopyAssignable
requirements and assignment of the deleter from an
lvalue of type D shall not throw an exception.