C++ 为什么分配器需要构造和销毁接口?

C++ 为什么分配器需要构造和销毁接口?,c++,interface,stl,implementation,allocator,C++,Interface,Stl,Implementation,Allocator,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和_Dest

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++11以来,标准容器不再允许直接调用分配器的
construct()
destroy()
,而是必须通过
std::allocator\u traits
类型traits来调用。

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