Почему распределителю нужен интерфейс построения и уничтожения?

Распределитель по умолчанию в 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, а не интерфейс, определенный в распределителе. Мой вопрос: зачем нам нужны два набора функций, чтобы делать одно и то же? Есть ли у них разница?


person coinsyx    schedule 14.09.2013    source источник
comment
_Construct и _Destroy не входят в стандартную библиотеку. На самом деле идентификаторы, начинающиеся со знака подчеркивания и заглавной буквы, зарезервированы для реализации, поэтому их использование будет ошибкой. Вместо этого вы должны использовать версии распределителя.   -  person john    schedule 14.09.2013


Ответы (1)


Функции _Construct и _Destroy не являются частью общедоступного интерфейса, а являются деталями реализации конкретной версии стандартной библиотеки, установленной в вашей системе. Любой идентификатор, начинающийся с двойного подчеркивания или одиночного подчеркивания и заглавной буквы, зарезервирован и не может вызываться пользователями.

Выбор реализации заключается в делегировании construct() и destroy() функций-членов распределителя этим функциям, не являющимся членами. Кстати, начиная с C++11, стандартные контейнеры больше не могут напрямую вызывать construct() и destroy() распределителя, но должны делать это через черту типа std::allocator_traits<Allocator>.

person TemplateRex    schedule 14.09.2013