为什么C++分配器要求不要求construct()构造value_type的对象?

Why do C++ allocator requirements not require that construct() constructs an object of value_type?

我在阅读时发现这很奇怪 this。它说value_type等于T,但是construct()构造了一个X类型的对象,与T.
没有任何关系 但是,reference page of std::vector 只表示

An allocator that is used to acquire/release memory and to construct/destroy the elements in that memory. The type must meet the requirements of Allocator. The behavior is undefined (until C++20)The program is ill-formed (since C++20) if Allocator::value_type is not the same as T.

所以我认为这意味着如果 Allocator 满足分配器的要求并且 Allocator::value_type 与 [=12= 相同,我可以将任何 Allocator 用于 std::vector<T, Allocator> ].
但是如果Allocator::construct()真正构造的不是Allocator::value_type,那么std::vector的实现怎么构造std::vector的元素呢?

编辑:好吧,std::vector 的实现可以只使用 'placement new',但是这个 Allocator::construct() 到底是怎么回事?如果它不是用于构建STL容器元素等情况,那么它真正意味着什么情况下使用?

请注意,a.construct(xp, args) 只是可选的。 std::vector 只需要 allocate() 分配内存,然后它可以使用 placement-new 在该内存中构造对象。如果分配器有 construct() 那么向量可以使用它在先前通过 allocate().

获得的内存中创建对象(也是 T 类型)

a.allocate:

Allocates storage suitable for an array object of type T[n] and creates the array, but does not construct array elements. May throw exceptions.

和returns指向已分配内存的指针。


I think I don't understand. X can be any type including T. Isn't that mean X can be something that is not T, so vector cannot use construct if the allocator it uses have X which is not equal to T?

没有。该列表是“Given...”并且有项目符号:

  • xp, a dereferenceable pointer to some cv-unqualified object type X

也就是说,你,调用者,选择了一些X。然后分配器必须满足 a.construct(xp, args) 构造类型 X 的对象的要求。 X 实际上是什么,没有指定,因此无论您选择 X 类型的 xp,分配器都必须满足该(可选)要求。


作为类比,假设有人写了一些乘法方法,要求是:

Given some x and y of type int:

  • the method returns the result of x*y.

现在,“int 类型的某些 x 和 y”是您选择的,而“方法 returns x*y 的结果”是方法必须满足的要求实现。这不是总是选择一些 x 和一些 y 和 returns 42 的方法,因为它会产生值 x==1y==42正确的结果。相反,它意味着对于您选择的任何 x 和任何 y,该方法应填写“方法 returns x*y 的结果”(为了简单起见,我此处忽略溢出)。