C++ std::list如何处理其分配器参数?

C++ std::list如何处理其分配器参数?,c++,stl,C++,Stl,std::list由分配器类型参数化,它可能会重新绑定以分配列表节点,而不是Ts。那么它如何处理传递给构造函数的分配器类型的对象呢 template <class T, class Alloc = std::allocator<T>> class list { class node { ... T element; ... }; using real_alloc = typename std::allocator_traits<Al

std::list
由分配器类型参数化,它可能会重新绑定以分配列表节点,而不是
T
s。那么它如何处理传递给构造函数的分配器类型的对象呢

template <class T, class Alloc = std::allocator<T>>
class list
{
    class node { ... T element; ... };

    using real_alloc =
        typename std::allocator_traits<Alloc>::template rebind_alloc<node>;
    real_alloc m_allocator;

public:
    list(const Alloc&);
};
模板
班级名单
{
类节点{…T元素;..};
使用real_alloc=
typename std::allocator\u traits::template rebind\u alloc;
实分配m_分配器;
公众:
列表(常量分配&);
};

在上面的代码中,我们需要将
m_分配器
初始化为节点分配器,但构造函数被赋予了
T
分配器。我们是将
T
分配器扔到地板上,还是以某种方式使用它?

T分配器仍然用于
construct()
destroy()
内部节点的
T
部分。在构造过程中,可能需要使用这些操作来添加自定义参数,例如,可以选择将合适的分配器参数转发给构造的对象。

因为
C++11
分配器可以是有状态的。您希望使用用户提供的内部分配器构造内部分配器。明确要求可以从
typename std::allocator\u traits::template rebind\u alloc
构造

列表构造函数的实现应该如下所示:

template<class T, class Alloc>
class list
{
      struct node_type {/*etc*/}; //internal
      using allocator_type_internal = typename std::allocator_traits<Alloc>::template rebind_alloc<node_type>;
      // etc.
      allocator_type_internal m_allocator; //Note we use allocator_type, not Alloc.
};

list::list(const Alloc& alloc ) : 
     m_allocator(alloc)
{ /* initialize sentinel node, etc. */ }
模板
班级名单
{
结构节点类型{/*etc*/};//内部
使用分配器\u type\u internal=typename std::分配器\u traits::template rebind\u alloc;
//等等。
分配器\u类型\u内部m\u分配器;//注意我们使用分配器\u类型,而不是Alloc。
};
列表::列表(常量Alloc和Alloc):
m_分配器(alloc)
{/*初始化sentinel节点等。*/}
尽管一个好的实现会对分配器使用空基优化