std::allocator
的{{1}}和construct
成员函数参数化了要构造的元素的类型:
destroy
这是什么理由?他们为什么不采取template<class T>
class allocator
{
public:
typedef T value_type;
typedef T* pointer;
template<class U, class... Args>
void construct(U *p, Args&&... args);
template<class U>
void destroy(U *p);
...
};
或value_type*
?似乎pointer
应该只知道如何构造或销毁allocator<T>
类型的对象。
答案 0 :(得分:16)
出于同样的原因,allocator
需要rebind<U>
typedef:因为许多容器永远不会分配T
。
获取链接列表。这些分配节点,每个节点包含 T
作为成员。因此allocator
需要能够分配一些他们不知道的类型(通过rebind<U>
)。但是,这需要复制操作:它需要创建类型为rebind<U>::other
的新分配器。
最好在可能的情况下避免这种情况。因此,对于构造和销毁,分配器需要对任何类型执行适当的操作,例如链表的内部节点类型。这也使得链表的内部节点类型可以Allocator::construct/destruct
作为友元函数。