Шаблон класса allocator_traits предоставляет единый интерфейс для всех типов распределителей. Однако распределитель не может быть неклассовым типом, даже если allocator_traits предоставляет весь требуемый интерфейс. [ Note: Таким образом, всегда можно создать производный класс из распределителя. ] — end note
namespace std { template <class Alloc> struct allocator_traits { using allocator_type = Alloc; using value_type = typename Alloc::value_type; using pointer = see below; using const_pointer = see below; using void_pointer = see below; using const_void_pointer = see below; using difference_type = see below; using size_type = see below; using propagate_on_container_copy_assignment = see below; using propagate_on_container_move_assignment = see below; using propagate_on_container_swap = see below; using is_always_equal = see below; template <class T> using rebind_alloc = see below; template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; static pointer allocate(Alloc& a, size_type n); static pointer allocate(Alloc& a, size_type n, const_void_pointer hint); static void deallocate(Alloc& a, pointer p, size_type n); template <class T, class... Args> static void construct(Alloc& a, T* p, Args&&... args); template <class T> static void destroy(Alloc& a, T* p); static size_type max_size(const Alloc& a) noexcept; static Alloc select_on_container_copy_construction(const Alloc& rhs); }; }
using pointer = see below;
Type: Alloc::pointer если qualified-id Alloc::pointer действительный и обозначает тип ([temp.deduct]); в противном случае value_type*.
using const_pointer = see below;
Type: Alloc::const_pointer если qualified-id Alloc::const_pointer действительный и обозначает тип ([temp.deduct]); в противном случае pointer_traits<pointer>::rebind<const value_type>.
using void_pointer = see below;
Type: Alloc::void_pointer если qualified-id Alloc::void_pointer действительный и обозначает тип ([temp.deduct]); в противном случае pointer_traits<pointer>::rebind<void>.
using const_void_pointer = see below;
Type: Alloc::const_void_pointer если qualified-id Alloc::const_void_pointer действительный и обозначает тип ([temp.deduct]); в противном случае pointer_traits<pointer>::rebind<const void>.
using difference_type = see below;
Type: Alloc::difference_type если qualified-id Alloc::difference_type действительный и обозначает тип ([temp.deduct]); в противном случае pointer_traits<pointer>::difference_type.
using size_type = see below;
Type: Alloc::size_type если qualified-id Alloc::size_type действительный и обозначает тип ([temp.deduct]); в противном случае make_unsigned_t<difference_type>.
using propagate_on_container_copy_assignment = see below;
Type: Alloc::propagate_on_container_copy_assignment если qualified-id Alloc::propagate_on_container_copy_assignment действительный и обозначает тип ([temp.deduct]); иначе false_type.
using propagate_on_container_move_assignment = see below;
Type: Alloc::propagate_on_container_move_assignment если qualified-id Alloc::propagate_on_container_move_assignment действительный и обозначает тип ([temp.deduct]); иначе false_type.
using propagate_on_container_swap = see below;
Type: Alloc::propagate_on_container_swap если qualified-id Alloc::propagate_on_container_swap действительный и обозначает тип ([temp.deduct]); иначе false_type.
using is_always_equal = see below;
Type: Alloc::is_always_equal если qualified-id Alloc::is_always_equal действительный и обозначает тип ([temp.deduct]); иначе is_empty<Alloc>::type.
template <class T> using rebind_alloc = see below;
Alias template: Alloc::rebind<T>::other если qualified-id Alloc::rebind<T>::other действительный и обозначает тип ([temp.deduct]); в противном случае, Alloc<T, Args> if Alloc является экземпляром формы шаблона класса Alloc<U, Args>, где Args - ноль или более аргументов типа; в противном случае создание экземпляра rebind_alloc будет некорректным.
static pointer allocate(Alloc& a, size_type n);
static pointer allocate(Alloc& a, size_type n, const_void_pointer hint);
Returns: a.allocate(n, hint) если это выражение правильно сформировано; в противном случае a.allocate(n).
static void deallocate(Alloc& a, pointer p, size_type n);
template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
Effects: Звонит, a.construct(p, std::forward<Args>(args)...) если этот звонок правильно сформирован; в противном случае вызывает ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...).
template <class T>
static void destroy(Alloc& a, T* p);
Effects: Звонит, a.destroy(p) если этот звонок правильно сформирован; в противном случае вызывает p->~T().
static size_type max_size(const Alloc& a) noexcept;
Returns: a.max_size() если это выражение правильно сформировано; в противном случае numeric_limits<size_type>::max()/sizeof(value_type).
static Alloc select_on_container_copy_construction(const Alloc& rhs);