【问题标题】:Why did std::allocator lose member types/functions in C++17?为什么 std::allocator 在 C++17 中丢失了成员类型/函数?
【发布时间】:2016-11-28 15:42:49
【问题描述】:

在查看std::allocator 时,我看到成员:
value_typepointer, const_pointer, reference, const_reference, size_type, difference_type,和 rebind 已全部弃用。

分配器也将不再拥有以下成员:
addressmax_sizeconstructdestroy

为什么会这样?是否与多态分配器有关?

【问题讨论】:

  • 第一组成员看起来确实对容器有意义,而不是分配器。我相信现在有一个std::addressof 来替换地址()。无论如何谁需要 max_size ;其余的应该可以通过放置新/显式析构函数调用来替换。
  • 现在还有一个allocator_traits 将填补缺失的部分。

标签: c++ memory-management stl allocator c++17


【解决方案1】:

如果您查看the relevant isocpp paper,您会发现您提到的第一组现在被认为更适合放在std::allocator_traits。自从 STL(甚至不是标准库)问世以来,使用 trait 发生了更多的转变。

rebind也是遗物。 STL 刚出来时,不支持别名和模板模板参数。有了这些语言特性,rebind 似乎相当复杂。例如,正如您在 an answer to this question 中看到的那样,在 C++ 编程语言,第 4 版,第 34.4.1 节,p。 998,评论默认分配器类中的“经典”重新绑定成员:

template<typename U>
     struct rebind { using other = allocator<U>;};

Bjarne Stroustupr 写道:“奇怪的重新绑定模板是一个古老的别名。它应该是:

template<typename U>
using other = allocator<U>;

但是,分配器是在 C++ 支持此类别名之前定义的。"

因此,总的来说,它是标准库赶上语言和范式转变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2021-02-19
    • 2022-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多