On Thu, Apr 09, 2020 at 08:59:59AM +0200, Martin Liška wrote: > What do you mean by 'decl flags'. We can't compare ASM names as one is ctor > and the second one is dtor. It's about argument types that much match, right?
You can't disginguish the [] vs. non-[] from arguments, plus there are some changes in the arguments in all cases anyway (e.g. first argument of operator delete always being the pointer, while first argument of operator new being size_t, but some operator delete forms also having size_t after it). See http://eel.is/c++draft/new.delete [[nodiscard]] void* operator new(std::size_t size); [[nodiscard]] void* operator new(std::size_t size, std::align_val_t alignment); [[nodiscard]] void* operator new(std::size_t size, const std::nothrow_t&) noexcept; [[nodiscard]] void* operator new(std::size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept; void operator delete(void* ptr) noexcept; void operator delete(void* ptr, std::size_t size) noexcept; void operator delete(void* ptr, std::align_val_t alignment) noexcept; void operator delete(void* ptr, std::size_t size, std::align_val_t alignment) noexcept; void operator delete(void* ptr, const std::nothrow_t&) noexcept; void operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept; [[nodiscard]] void* operator new[](std::size_t size); [[nodiscard]] void* operator new[](std::size_t size, std::align_val_t alignment); [[nodiscard]] void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; [[nodiscard]] void* operator new[](std::size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept; void operator delete[](void* ptr) noexcept; void operator delete[](void* ptr, std::size_t size) noexcept; void operator delete[](void* ptr, std::align_val_t alignment) noexcept; void operator delete[](void* ptr, std::size_t size, std::align_val_t alignment) noexcept; void operator delete[](void* ptr, const std::nothrow_t&) noexcept; void operator delete[](void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept; I believe one can't allocate with operator new and free with operator delete[] or allocate with operator new[] and free with operator delete, but am not sure if there aren't other requirements? E.g. "If the alignment parameter is not present, ptr was returned by an allocation function without an alignment parameter. If present, the alignment argument is equal to the alignment argument passed to the allocation function that returned ptr." suggests one can't mix the std::align_val_t vs. non-std::align_val_t cases, dunno about the throwing vs. non-throwing or sizd ones. Jakub