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

Kel*_*tek 3 c++ templates linked-list allocator

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

我的节点的简化版本在这里。

class Node {
    Node* next, prev;
    T data; // Not T*
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*eyA 7

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

这种类型允许分配器将它用 ( T)实例化的类型转换为分配的实际类型的分配器 - 列表或其他一些容器(例如映射)的特殊内容。

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