std::polymorphic_allocator should require [[nodiscard]]Section: 20.5.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.5.3 [mem.poly.allocator.class], class template polymorphic_allocator
synopsis, as indicated:
namespace std::pmr {
template<class Tp = byte> class polymorphic_allocator {
[…]
// 20.5.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.5.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
nobjects 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;