首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::allocator::construct和std::allocator::destroy在元素类型上模板化?

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

Stack Overflow用户
提问于 2012-05-11 08:49:33
回答 1查看 1.1K关注 0票数 8

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

代码语言:javascript
复制
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类型的对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-11 09:08:01

这与要求allocator具有rebind<U>类型定义f的原因是相同的:因为许多容器从不分配T

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

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10544014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档