Легально ли операторы new и delete, объявленные в одном классе, применять для другого класса?

Допустим, я объявил некоторый класс-контейнер, содержащий перегруженные операторы new() и delete():

class MyNewContainer
{
public:
    INLINE void* operator new(size_t uMemSize)                    {...}
    INLINE void* operator new[](size_t uMemSize)                  {...}
    INLINE void operator delete(void* pMem)                       {...}
    INLINE void operator delete(void* pMem, size_t uMemSize)      {...}
    INLINE void operator delete[](void* pMem)                     {...}
    INLINE void operator delete[](void* pMem, size_t uMemSize)    {...}
};

И допустим, я объявил следующий шаблон класса (пусть будет элемент односвязного списка):

template <typename TData, class TNewContainer>
class CNode
{
    CNode*  m_pNextNode;
    TData   m_data;

public:
    template <typename... TArgs> INLINE CNode(TArgs... args): m_pNextNode(NULL), m_data(args...) {}
    INLINE CNode(CNode& rSrcNode): m_data(rSrcNode.m_data) {}
    INLINE CNode& operator=(CNode& rSrcNode) = delete;

    INLINE void* operator new(size_t uMemSize)               {return TNewContainer::operator new(uMemSize);}
    INLINE void operator delete(void* pMem)                  {TNewContainer::operator delete(pMem);}
    INLINE void operator delete(void* pMem, size_t uMemSize) {TNewContainer::operator delete(pMem,uMemSize);}
    ......
};

И, соответственно, пример использования выше приведенных классов:

auto pNode = new CNode<int,MyNewContainer>();

Вопрос: насколько в C++ легален такой подход к кастомизации операций создания/удаления объектов?

На практике этот приём показал прекрасные результаты, всё компилируется и работает так, как я и задумал. Однако зная о наличии огромного фолианта всевозможных неочевидных запретов и правил в языке C++, нарушение которых в большинстве случаев не приводит к потере работоспособности кода, но тем не менее формально считается UB, я всё же хочу спросить у профессионалов: действительно ли не запрещается применять операторы new() и delete(), объявленные в одном классе, для создания/удаления объектов совсем другого класса?


Ответы (0 шт):