With recent (> 15, as far as I can tell, possibly > 16) clang, c++17,
and GNU's libstdc++ (versions 9 and 10 and maybe others), LLVM fails
to compile due to an is_invocable() check in unique_ptr::reset().
To resolve this issue, add a template argument to ImplDeleter to make
things work.
Is the default type required? Also, "DelT" makes it sound like it's the type of the deleter rather. Since this struct is the "Impl" Deleter, either name it "ImplT" or "DataT" or something like that. I would recommend "ImplT" ... it can't conflict within its own scope.