Легально ли операторы 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(), объявленные в одном классе, для создания/удаления объектов совсем другого класса?