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

3471. polymorphic_allocator::allocate does not satisfy Cpp17Allocator requirements

Section: 20.4 [mem.res] Status: C++23 Submitter: Alisdair Meredith Opened: 2020-07-27 Last modified: 2023-11-22

Priority: 3

View all other issues in [mem.res].

View all issues with C++23 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 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.

[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.4.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.2.12 [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.4.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.

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy