Deallocation functions shall be class member functions or global
functions; a program is ill-formed if deallocation functions are
declared in a namespace scope other than global scope or declared static
in global scope.
A deallocation function
is a destroying operator delete
if it has at least two parameters
and its second parameter
is of type std::destroying_delete_t.
A destroying operator delete
shall be a class member function named operatordelete.
If the function is a destroying operator delete
declared in class type C,
the type of its first parameter shall be C*;
otherwise, the type of its first
parameter shall be void*.
A deallocation function may have more
than one parameter.
If a deallocation function terminates by throwing an exception, the behavior is undefined.
The value of the first argument supplied to a deallocation function may
be a null pointer value; if so, and if the deallocation function is one
supplied in the standard library, the call has no effect.
If the argument given to a deallocation function in the standard library
is a pointer that is not the null pointer value ([basic.compound]), the
deallocation function shall deallocate the storage referenced by the
pointer, ending the duration of the region of storage.
The global operatordelete(void*, std::size_t)
precludes use of an
allocation function voidoperatornew(std::size_t, std::size_t) as a placement
allocation function ([diff.cpp11.basic]).