为什么std :: allocator在C ++ 17中丢失成员类型/函数?
在查看 std :: allocator 时,我看到了以下成员: value_type
,指针
, const_pointer
,引用
, const_reference
, size_type
, difference_type
和 rebind
已全部弃用。
While looking at std::allocator, I see that members:value_type
,
pointer
,
const_pointer
,
reference
,
const_reference
,
size_type
,
difference_type
, and
rebind
have all been deprecated.
分配者也将不再具有成员:地址
, max_size
,构造
或破坏
。
Allocators will also no longer have the members:address
, max_size
, construct
, or destroy
.
为什么会这样?
如果您查看相关的isocpp论文,您会发现现在想到的是您提到的第一个论文集最好放在 std :: allocator_traits
。自从STL(甚至不是标准库)问世以来,使用特征的转移就更多了。
If you look at the relevant isocpp paper you can see that the first set you mention is now thought to be better placed in std::allocator_traits
. Since the STL (not even standard library) came out, there's been more of a shift to use traits.
重新绑定
也是遗物。首次发布STL时,不支持别名和模板模板参数。有了这些语言功能, rebind
似乎相当复杂。例如,如您在中看到的那样,在《 The C ++ Programming Language》,第4版,第34.4.1节,p 998,注释默认分配程序类中的经典重新绑定成员:
rebind
is also a relic. When the STL first came out, aliases and template-template parameters were not supported. With these language features in existence, rebind
seems fairly convoluted. E.g., as you can see in an answer to this question, in The C++ Programming Language, 4th edition, section 34.4.1, p. 998, commenting the 'classical' rebind member in default allocator class :
template<typename U>
struct rebind { using other = allocator<U>;};
Bjarne Stroustupr写道:好奇的重新绑定模板是一个古老的别名。应该是:
Bjarne Stroustupr writes this : "The curious rebind template is an archaic alias. It should have been:
template<typename U>
using other = allocator<U>;
但是,分配器是在C ++支持此类别名之前定义的。
However, allocator was defined before such aliases were supported by C++."
总的来说,这是赶上语言和范式转变的标准库。
So, altogether, it's the standard library catching up with the language and paradigm shifts.