It wouldn't make life easier as it would artifically constrict any client of shared_ptr
to either be tied to one particular allocator type or itself by templated on an allocator type.
Only some constructors and functions (e.g. some reset
overloads) need to know about the allocator used to allocated the shared object. Many clients can happily be allocator agnostic.
Having fewer template parameters on the type is less constraining. Note that template parameters on class types must usually be specified explicitly where as on function templates they can often be deduced from parameters.