为什么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==1
和 y==42
正确的结果。相反,它意味着对于您选择的任何 x
和任何 y
,该方法应填写“方法 returns x*y
的结果”(为了简单起见,我此处忽略溢出)。
我在阅读时发现这很奇怪 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 typeX
也就是说,你,调用者,选择了一些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==1
和 y==42
正确的结果。相反,它意味着对于您选择的任何 x
和任何 y
,该方法应填写“方法 returns x*y
的结果”(为了简单起见,我此处忽略溢出)。