STL分配器需要这个构造函数表单(20.1.5):X a(b);
,要求Y(a) == b;
在标准实现中,这意味着,并实现为:
template<class U> allocator( const allocator<U> & o ) throw()
我无法理解为什么存在此要求。我知道分配器应该是静态的(没有任何状态),但为什么你能够像这样转换它们呢?
答案 0 :(得分:6)
允许来自其他分配器的构造,因为容器需要使用与您指定的不同的分配器类型。例如,列表和映射分配其内部节点类型,而不是它们公开的value_type。
代码类似于:
template<class T, class Alloc=std::allocator<T> >
struct Container {
typedef T value_type;
typedef Alloc allocator_type;
private:
struct Node {/*...*/};
typedef typename Alloc::template rebind<Node>::other RealAllocatorType;
RealAllocatorType allocator;
};