[allocator.traits.general] (original) (raw)

The class template allocator_traits supplies a uniform interface to all allocator types.

An allocator cannot be a non-class type, however, even if allocator_traitssupplies the entire required interface.

[Note 1:

Thus, it is always possible to create a derived class from an allocator.

— _end note_]

If a program declares an explicit or partial specialization of allocator_traits, the program is ill-formed, no diagnostic required.

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 constexpr pointer allocate(Alloc& a, size_type n);static constexpr pointer allocate(Alloc& a, size_type n, const_void_pointer hint);static constexpr allocation_result<pointer, size_type> allocate_at_least(Alloc& a, size_type n);static constexpr void deallocate(Alloc& a, pointer p, size_type n);template<class T, class... Args> static constexpr void construct(Alloc& a, T* p, Args&&... args);template<class T> static constexpr void destroy(Alloc& a, T* p);static constexpr size_type max_size(const Alloc& a) noexcept;static constexpr Alloc select_on_container_copy_construction(const Alloc& rhs);};}