【问题标题】:Why does allocator need construct and destroy interface?为什么分配器需要构造和销毁接口?
【发布时间】:2013-09-18 22:22:09
【问题描述】:

stl 中的默认分配器具有构造和销毁元素的接口。

void construct(pointer __p, const _Tp& __val)
void destroy(pointer __p)

但是 stl 也提供了两种函数来做同样的事情。这些函数在 stl_construct.h 中定义。

void _Construct(_T1* __p, const _T2& __value)
void _Destroy(_Tp* pointer)

我看到向量模板使用 _Construct 和 _Destroy 而不是分配器中定义的接口。我的问题是为什么我们需要两组函数来做同样的事情?它们有什么区别吗?

【问题讨论】:

  • _Construct 和 _Destroy 不是标准库的一部分。事实上,以下划线和大写字母开头的标识符是为实现保留的,因此使用它们实际上是错误的。您应该改用分配器版本。

标签: c++ interface stl implementation allocator


【解决方案1】:

_Construct_Destroy 函数不是公共接口的一部分,而是您系统上特定标准库版本的实现细节。任何以双下划线或单下划线和大写字母开头的标识符都是保留的,不被用户调用。

将分配器的construct()destroy() 成员函数委托给这些非成员函数是一种实现选择。顺便说一句,从 C++11 开始,标准容器不再允许直接调用分配器的 construct()destroy(),但必须通过 std::allocator_traits<Allocator> 类型 trait 这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2022-11-29
    • 2014-04-13
    • 1970-01-01
    • 2017-12-07
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多