polymorphic_allocator::allocate does not satisfy Cpp17Allocator requirements
Alisdair Meredith

Created on 2020-07-27.00:00:00 last changed 6 months ago


Date: 2020-08-21.13:34:21

Proposed resolution:

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 [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]);
Date: 2020-08-15.00:00:00

[ 2020-08-21; Reflector prioritization ]

Set priority to 3 after reflector discussions.

Date: 2020-08-15.00:00:00

[ 2020-08-03; Billy comments ]

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

Date: 2020-07-27.00:00:00

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 Ts (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.

Date User Action Args
2020-08-21 13:34:21adminsetmessages: + msg11438
2020-08-03 19:47:49adminsetmessages: + msg11431
2020-08-02 17:02:36adminsetmessages: + msg11425
2020-07-27 00:00:00admincreate