The library describes a standard set of requirements for allocators,
which are class-type objects that encapsulate the information about an allocation model.

This information includes the knowledge of pointer types, the type of their
difference, the type of the size of objects in this allocation model, as well
as the memory allocation and deallocation primitives for it.

In general, if
the name Allocator is bound to SomeAllocator<T>, then
Allocator​::​rebind<U>​::​other is the same type as
SomeAllocator<U>, where
SomeAllocator<T>​::​value_­type is T and
SomeAllocator<U>​::​​value_­type is U.

— end note

]

If
Allocator is a class template instantiation of the form
SomeAllocator<T, Args>, where Args is zero or more type
arguments, and Allocator does not supply a rebind member
template, the standard allocator_­traits template uses
SomeAllocator<U, Args> in place of Allocator​::​​rebind<U>​::​other
by default.

For allocator types that are not template instantiations of the
above form, no default is provided.

X​::​pointer and X​::​const_­pointer shall also
meet the requirements for
a Cpp17RandomAccessIterator ([random.access.iterators]) and
the additional requirement that, when a and (a + n) are
dereferenceable pointer values for some integral value n,

Then, x1 and x2 are
equivalently-valued pointer values, if and only if both x1 and x2
can be explicitly converted to the two corresponding objects px1 and px2
of type X​::​const_­pointer, using a sequence of static_­casts
using only these four types, and the expression px1 == px2
evaluates to true.