std::polymorphic_allocator
should require [[nodiscard]]
Section: 20.4.3 [mem.poly.allocator.class] Status: C++20 Submitter: Hiroaki Ando Opened: 2019-10-16 Last modified: 2021-02-25
Priority: 3
View all other issues in [mem.poly.allocator.class].
View all issues with C++20 status.
Discussion:
[[nodiscard]]
is specified for std::polymorphic_allocator<>::allocate()
.
[[nodiscard]]
necessary for these functions?
[2019-11 Priority to 3 during Monday issue prioritization in Belfast]
[2019-11 After discussion with LEWG, assigning to LEWG]
[2019-11-4; Daniel comments]
This issue is related to LWG 3312.
[2019-11; Friday AM in Belfast. Status changed to "Ready"]
Proposed resolution:
This wording is relative to N4835.
Modify 20.4.3 [mem.poly.allocator.class], class template polymorphic_allocator
synopsis, as indicated:
namespace std::pmr { template<class Tp = byte> class polymorphic_allocator { […] // 20.4.3.3 [mem.poly.allocator.mem], member functions [[nodiscard]] Tp* allocate(size_t n); void deallocate(Tp* p, size_t n); [[nodiscard]] 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> [[nodiscard]] T* allocate_object(size_t n = 1); template<class T> void deallocate_object(T* p, size_t n = 1); template<class T, class... CtorArgs> [[nodiscard]] T* new_object(CtorArgs&&... ctor_args); template<class T> void delete_object(T* p); […] }; }
Modify 20.4.3.3 [mem.poly.allocator.mem] as indicated:
[[nodiscard]] void* allocate_bytes(size_t nbytes, size_t alignment = alignof(max_align_t));[…]-5- Effects: Equivalent to:
[…]return memory_rsrc->allocate(nbytes, alignment);
template<class T> [[nodiscard]] T* allocate_object(size_t n = 1);-8- Effects: Allocates memory suitable for holding an array of
n
objects of typeT
, as follows:[…]
(8.1) — if
SIZE_MAX / sizeof(T) < n
, throwslength_error
,(8.2) — otherwise equivalent to:
return static_cast<T*>(allocate_bytes(n*sizeof(T), alignof(T)));template<class T, class CtorArgs...> [[nodiscard]] T* new_object(CtorArgs&&... ctor_args);-11- Effects: Allocates and constructs an object of type
T
, as follows. Equivalent to:[…]T* p = allocate_object<T>(); try { construct(p, std::forward<CtorArgs>(ctor_args)...); } catch (...) { deallocate_object(p); throw; } return p;