为什么std :: allocator :: construct和std :: allocator :: destroy模板化元素类型?

时间:2012-05-11 00:49:33

标签: c++ c++11 allocation allocator

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>类型的对象。

1 个答案:

答案 0 :(得分:16)

出于同样的原因,allocator需要rebind<U> typedef:因为许多容器永远不会分配T

获取链接列表。这些分配节点,每个节点包含 T作为成员。因此allocator需要能够分配一些他们不知道的类型(通过rebind<U>)。但是,这需要复制操作:它需要创建类型为rebind<U>::other的新分配器。

最好在可能的情况下避免这种情况。因此,对于构造和销毁,分配器需要对任何类型执行适当的操作,例如链表的内部节点类型。这也使得链表的内部节点类型可以Allocator::construct/destruct作为友元函数。