为什么 std::allocator 在 C++17 中失去成员 types/functions?
Why did std::allocator lose member types/functions in C++17?
在查看 std::allocator 时,我看到成员:
value_type
,
pointer
,
const_pointer
,
reference
,
const_reference
,
size_type
,
difference_type
, 和
rebind
已全部弃用。
分配器也将不再有成员:
address
、max_size
、construct
或 destroy
。
为什么会这样?它与多态分配器有关吗?
如果你看the relevant isocpp paper you can see that the first set you mention is now thought to be better placed in std::allocator_traits
。自从 STL(甚至不是标准库)问世以来,更多的是使用特征。
rebind
也是遗物。 STL刚出来的时候,不支持别名和template-template参数。有了这些语言特性,rebind
看起来相当复杂。例如,正如您在 an answer to this question 中看到的,在 The C++ Programming Language,第 4 版,第 34.4.1 节,p. 998,在默认分配器 class 中评论 'classical' 重新绑定成员:
template<typename U>
struct rebind { using other = allocator<U>;};
Bjarne Stroustupr 写道:“奇怪的重新绑定模板是一个古老的别名。它应该是:
template<typename U>
using other = allocator<U>;
但是,分配器是在 C++ 支持此类别名之前定义的。"
所以,总的来说,标准库赶上了语言和范式的转变。
在查看 std::allocator 时,我看到成员:
value_type
,
pointer
,
const_pointer
,
reference
,
const_reference
,
size_type
,
difference_type
, 和
rebind
已全部弃用。
分配器也将不再有成员:
address
、max_size
、construct
或 destroy
。
为什么会这样?它与多态分配器有关吗?
如果你看the relevant isocpp paper you can see that the first set you mention is now thought to be better placed in std::allocator_traits
。自从 STL(甚至不是标准库)问世以来,更多的是使用特征。
rebind
也是遗物。 STL刚出来的时候,不支持别名和template-template参数。有了这些语言特性,rebind
看起来相当复杂。例如,正如您在 an answer to this question 中看到的,在 The C++ Programming Language,第 4 版,第 34.4.1 节,p. 998,在默认分配器 class 中评论 'classical' 重新绑定成员:
template<typename U>
struct rebind { using other = allocator<U>;};
Bjarne Stroustupr 写道:“奇怪的重新绑定模板是一个古老的别名。它应该是:
template<typename U>
using other = allocator<U>;
但是,分配器是在 C++ 支持此类别名之前定义的。"
所以,总的来说,标准库赶上了语言和范式的转变。