23 General utilities library [utilities]

23.10 Memory [memory]

23.10.8 Allocator traits [allocator.traits]

Шаблон класса 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);
  };
}

23.10.8.1 Allocator traits member types [allocator.traits.types]

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 будет некорректным.

23.10.8.2 Allocator traits static member functions [allocator.traits.members]

static pointer allocate(Alloc& a, size_type n);

Returns: a.allocate(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);

Effects: Звонки a.deallocate(p, n).

Throws: Ничего такого.

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);

Returns: rhs.select_­on_­container_­copy_­construction() если это выражение правильно сформировано; в противном случае rhs.