Я разрабатываю контейнерный класс, и я бы хотел использовать стандартную инфраструктуру распределителя так же, как и стандартные контейнеры. В сети я нахожу много материала о том, как использовать только класс std::allocator
или как определить пользовательский распределитель для стандартных контейнеров, но материал о том, как сделать в основном использование стандартного соответствующего распределителя, очень редок, в особенно в контексте С++ 11, где вещи кажутся намного проще с точки зрения того, кто пишет пользовательский распределитель, но более сложный с точки зрения контейнера.
Итак, мой вопрос в том, как правильно использовать стандартный соответствующий распределитель наиболее общим образом, в частности:
- Прежде всего, когда я должен создать пользовательский контейнер таким образом? Существует ли разумная служебная нагрузка (включая отсутствующие возможности оптимизации) при использовании распределителя по умолчанию вместо простого нового/удаления?
- Должен ли я явно вызвать деструкторы содержащихся объектов?
- Как я могу различить между агентами с сохранением состояния и безстоящими?
- Как обрабатывать генераторы с сохранением состояния?
- Когда (если когда-либо) два экземпляра взаимозаменяемы (когда я могу уничтожить с одним экземпляром память, выделенную с другой)?
- Они должны быть скопированы при копировании контейнера?
- Они могут/должны быть перемещены при перемещении контейнера?
- В конструкторе перемещения контейнера и операторе присваивания перемещения, когда я могу переместить указатель в выделенную память и когда мне нужно выделить другую память и переместить элементы вместо этого?
- Есть ли проблемы с безопасностью исключений в этом контексте?
Мне особенно интересен ответ о мире С++ 11 (это что-то меняет в С++ 14?)