为什么shared_ptr类型没有模板分配器参数

Why shared_ptr type has no template allocator parameter?

本文关键字:分配器 参数 shared ptr 类型 为什么      更新时间:2023-10-16

shared_ptr定义为

template< class T > class shared_ptr;

自定义分配器作为构造函数参数传递

template< class Y, class Deleter, class Alloc >
shared_ptr( Y* ptr, Deleter d, Alloc alloc );

为什么没有

template< class T, class Alloc = std::allocator<T> > class shared_ptr;

我觉得这在某些情况下会让生活更轻松,但另一方面,它会阻止做这样的事情:

namespace App{
    template <typename T>
    using Shared = std::shared_ptr<T,myAllocator<T>>; //pool allocator for control blocks
}

此外,make_shared不允许这样做,因为它已经将构造函数的参数作为参数。

有什么想法吗?

它不会让生活更轻松,因为它会人为地限制任何shared_ptr客户端绑定到一个特定的分配器类型或通过模板化分配给器类型来

绑定。

只有一些构造函数和函数(例如,一些reset重载)需要知道用于分配共享对象的分配器。许多客户可以愉快地成为分配者不可知论者。

类型上的模板参数较少,约束较少。请注意,类类型的模板参数通常必须显式指定,而函数模板上的模板参数通常可以从参数中推导出来。