C++ 为什么std::list可以有一个类型为T的分配器?

C++ 为什么std::list可以有一个类型为T的分配器?,c++,templates,linked-list,allocator,C++,Templates,Linked List,Allocator,我正在尝试实现我自己的符合标准的链表,但我似乎不明白为什么您需要t分配器。在我的实现中,node类保存T本身,而不是指向存储在内存中其他位置的T的指针,因此T永远不会被显式分配,而只是作为节点的一部分创建。我会理解为什么您可能需要一个节点分配器,但为什么需要一个T 这里是我的节点的简化版本 class Node { Node* next, prev; T data; // Not T* } 欢迎来到分配器的奇妙世界!您的观察非常正确,这就是为什么每个分配器中都必须有一个rebi

我正在尝试实现我自己的符合标准的链表,但我似乎不明白为什么您需要t分配器。在我的实现中,node类保存T本身,而不是指向存储在内存中其他位置的T的指针,因此T永远不会被显式分配,而只是作为节点的一部分创建。我会理解为什么您可能需要一个节点分配器,但为什么需要一个T

这里是我的节点的简化版本

class Node {
    Node* next, prev;
    T data; // Not T*
}

欢迎来到分配器的奇妙世界!您的观察非常正确,这就是为什么每个分配器中都必须有一个
rebind
类型成员的原因

此类型允许分配器将其实例化时使用的类型(
T
)转换为实际分配类型的分配器-列表或其他容器(例如映射)的特殊类型


我个人认为更好的解决方案是使用分配器模板参数,并允许容器获得具体类型-但在STL设计时,模板参数仍然没有得到广泛支持。

我知道的所有实现都会立即在内部反弹。你不能确切地要求用户为你的内部节点类型提供一个分配器。因此,基本上我只需要将rebind与我的分配器一起使用来分配我的节点,而不必担心它最初是如何用于Ts?@Keltek的,就像那样。尽管它始终会重新绑定,最初应该为分配器和容器传递相同的
T