[mem.poly.allocator.class.general] (original) (raw)
A specialization of class template pmr::polymorphic_allocator meets the Cpp17Allocator requirements ([allocator.requirements.general]) if its template argument is a cv-unqualified object type.
Constructed with different memory resources, different instances of the same specialization of pmr::polymorphic_allocatorcan exhibit entirely different allocation behavior.
This runtime polymorphism allows objects that use polymorphic_allocatorto behave as if they used different allocator types at run time even though they use the same static allocator type.
A specialization of class template pmr::polymorphic_allocatormeets the allocator completeness requirements ([allocator.requirements.completeness]) if its template argument is a cv-unqualified object type.
namespace std::pmr { template<class Tp = byte> class polymorphic_allocator { memory_resource* memory_rsrc; public: using value_type = Tp; polymorphic_allocator() noexcept; polymorphic_allocator(memory_resource* r); polymorphic_allocator(const polymorphic_allocator& other) = default;template<class U> polymorphic_allocator(const polymorphic_allocator<U>& other) noexcept; polymorphic_allocator& operator=(const polymorphic_allocator&) = delete; Tp* allocate(size_t n);void deallocate(Tp* p, size_t n);void* allocate_bytes(size_t nbytes, size_t alignment = alignof(max_align_t));void deallocate_bytes(void* p, size_t nbytes, size_t alignment = alignof(max_align_t));template<class T> T* allocate_object(size_t n = 1);template<class T> void deallocate_object(T* p, size_t n = 1);template<class T, class... CtorArgs> T* new_object(CtorArgs&&... ctor_args);template<class T> void delete_object(T* p);template<class T, class... Args> void construct(T* p, Args&&... args);template<class T> void destroy(T* p); polymorphic_allocator select_on_container_copy_construction() const; memory_resource* resource() const;friend bool operator==(const polymorphic_allocator& a,const polymorphic_allocator& b) noexcept { return *a.resource() == *b.resource();} };}