This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of WP status.

### 3471. `polymorphic_allocator::allocate` does not satisfy Cpp17Allocator requirements

Section: 20.12 [mem.res] Status: WP Submitter: Alisdair Meredith Opened: 2020-07-27 Last modified: 2022-02-10

Priority: 3

View all other issues in [mem.res].

View all issues with WP status.

Discussion:

With the adoption of P0593R6 in Prague, `std::ptr::polymorphic_allocator` no longer satisfies the of Cpp17Allocator requirements. Specifically, all calls to `allocate(n)` need to create an object for an array of `n T`s (but not initialize any of those elements). `std::pmr::polymorphic_allocator` calls its underlying memory resource to allocate sufficient bytes of storage, but it does not create (and start the lifetime of) the array object within that storage.

[2020-08-03; Billy comments]

It's worth noting that the resolution of CWG 2382 has impact on implementors for this issue.

[2020-08-21; Reflector prioritization]

Set priority to 3 after reflector discussions.

Previous resolution [SUPERSEDED]:

> This wording is relative to N4861.

> > [Drafting note: The proposed wording is inspired by the example given in the "Assertion/note" column of the expression `a.allocate(n)` in table [tab:cpp17.allocator].]

> 1. Modify 20.12.2.2 [mem.res.public] as indicated:

>    >     [[nodiscard]] void* allocate(size_t bytes, size_t alignment = max_align);

>    > > -2- Effects: Equivalent to: `return do_allocate(bytes, alignment);`

>    > > >     void* p = do_allocate(bytes, alignment);
>    > > >     return launder(new (p) byte[bytes]);

[2021-05-20 Tim comments and updates wording]

`memory_resource::allocate` is the PMR equivalent of `malloc` and `operator new`. It therefore needs the "suitable created object" wording (see 6.7.2 [intro.object], 20.10.11 [c.malloc]). This ensures that it creates the requisite array object automatically for all the allocation functions of `polymorphic_allocator`, and returns the correct pointer value in all cases.

[2022-01-31; Reflector poll]

Set status to Tentatively Ready after seven votes in favour during reflector poll.

[2022-02-10 Approved at February 2022 virtual plenary. Status changed: Tentatively Ready → WP.]

Proposed resolution:

This wording is relative to N4885.

1. Modify 20.12.2.2 [mem.res.public] as indicated:

   >     [[nodiscard]] void* allocate(size_t bytes, size_t alignment = max_align);

   > > -2- Effects: Equivalent to: `return` Allocates storage by calling `do_allocate(bytes, alignment)``;` and implicitly creates objects within the allocated region of storage.

   > > -?- Returns: A pointer to a suitable created object (6.7.2 [intro.object]) in the allocated region of storage.

   > > -?- Throws: What and when the call to `do_allocate` throws.