std::allocatorconstructdestroy成员函数在要构造的元素类型上进行参数化:

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/

10-10 03:16