std::allocator
的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>
应该只知道如何构造或销毁T
类型的对象。 最佳答案
出于同样的原因,要求allocator
具有rebind<U>
typedef:因为许多容器从不分配T
。
取得链表。这些分配节点,每个分配节点都包含一个T
作为成员。因此,要求allocator
能够分配一些未知的类型(通过rebind<U>
)。但是,这需要复制操作:它需要创建类型为rebind<U>::other
的新分配器。
最好尽可能避免这种情况。因此,对于构造和销毁,要求分配器对任何类型(例如链表的内部节点类型)执行适当的操作。这也使链表的内部节点类型可以将Allocator::construct/destruct
作为 friend 功能。
关于c++ - 为什么在元素类型上将std::allocator::construct和std::allocator::destroy模板化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10544014/