polymorphic_allocator::allocate
does not satisfy Cpp17Allocator requirementsSection: 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 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].]
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.
Modify 20.4.2.2 [mem.res.public] as indicated:
[[nodiscard]] void* allocate(size_t bytes, size_t alignment = max_align);-2- Effects:
-?- 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 toEquivalent to:Allocates storage by callingreturn
do_allocate(bytes, alignment)
and implicitly creates objects within the allocated region of storage.;
do_allocate
throws.