Чтобы объяснить allocator_traits в терминах шаблона проектирования, его Адаптер позволяет обернуть ваш собственный Allocator, который удовлетворяет гораздо меньшим требованиям реализации (не нужно создавать, уничтожать, все эти typedefs ...) и поворачивать егов FlyWeight объект, который выполняет остальные требования реализации Allocator для вас со статическими членами и типами.
С помощью allocator_traits вам просто нужно предоставить не менее 10 строк кода для вашего пользовательского распределителя, согласно странице 3 документа open-std Scoped Allocator Model (спасибо за @icecrime за упоминание).
Я думаю, что allocator_traits и allocator - это хороший реальный пример превращения не-FlyWeight объект в FlyWeight, чтобы облегчить бремя деталей реализации.Это хорошая практика проектирования API для превращения класса в FlyWeight, который должен был быть в первую очередь FlyWeight.
Для программистов Java, с точки зрения шаблона проектирования, std :: allocator_traits подобен пакетным закрытым классам CharacterDataLatin1,ChracterData00, CharacterData0E, 01, 02 ... который наследуется от java.lang.CharacterData для предоставления статического определения Unicode и помощников, которые должны использоваться всеми экземплярами классов Character (std :: allocator).
Редактировать : еще одно преимущество косвенного вызова вашего пользовательского распределителя с помощью allocator_traits заключается в том, что он гарантирует совместимость с foward (стр. 3 из Модель распределителя Scoped ).Количество требований может возрасти в будущем, и даже если вы не знаете о внедрении новых требований к вашему распределителю, эти требования уже будут присутствовать в allocator_traits, реализованном производителем компилятора.Зная, что контейнеры C ++ вызывают allocator косвенно с помощью allocator_traits, контейнеры STL, использующие ваш пользовательский распределитель, получат выгоду от новых требований без необходимости изменения вашего кода.