当分配器感知容器获得 copied/moved 时,反弹分配器是否获得 copied/moved?

Do rebound allocators get copied/moved when an allocator aware container gets copied/moved?

这个问题与其说是一个实际问题,不如说是一个好奇心。

在 C++ 中,许多容器是 "noded based"。这意味着对于存储,他们不能真的使用传递给他们的分配器,相反,他们会做类似的事情:

typedef typename A::template rebind<node>::other node_allocator_type

并且大概会像这样或类似地创建这种类型的成员:

node_allocator_type node_allocator;

创建一个可以分配节点的分配器。太好了,这一切都说得通,但我有一个问题,如果容器确实 "allocator aware",支持有状态分配器,那么在容器 copy/move 期间会发生什么。

节点分配器是否也得到 copied/moved?这在表面层面上是有意义的,但是当我们点击一​​个 copy/move 构造函数时会发生什么,用户可以在其中指定一个新的分配器?

list( const list& other, const Allocator& alloc );
list( list&& other, const Allocator& alloc );

在这种情况下,other 的分配器不会被复制或移动,因此新构建的列表会得到一个全新的 node_allocator 以及 copied/moved alloc?

这显然是一个实现细节,但我很好奇什么是 "right" 以及典型的实现是做什么的。我还认识到 C++11 之前的状态分配器没有得到很好的支持,因此这不是问题。

假设复制构造分配器(甚至有状态分配器)是一种廉价操作;如果他们有任何相关资源,他们 should be held by reference. Furthermore rebound allocators may be constructed by copy, and these compare equal to the original allocator; see a == b in Cpp17Allocator requirements.

这样做的结果是容器可以完全自由地存储 AllocatorAllocator::rebind<void>Allocator::rebind<node_type>,并根据需要在它们之间进行复制转换在分配节点时,在移动构造时,在 get_allocator() 的 (prvalue!) return 等上。例如,通常是 libstdc++ storesAllocator::rebind<node_type>