оператор new внутри пространства имен


namespace X
{
  void* operator new (size_t);
}

Выдает сообщение об ошибке в виде:

error: ‘void* X::operator new(size_t)’ may not be declared within a namespace

Это Ошибка компилятора gcc ? В старой версии gcc это, кажется, работает. Есть идеи, почему это запрещено ?

Пример использования : Я хотел разрешить только пользовательские operator new/delete для классов и хотел запретить глобальные new/operator. Вместо ошибки компоновщика было легко поймать ошибку компилятора; поэтому я закодировал:

namespace X {
  void* operator new (size_t);
}
using namespace X;

Это сработало для старой версии gcc, но не для новой.

2 7

2 ответа:

Ответ@Sharptooth имеет больше смысла, если мы рассмотрим этот раздел из стандарта:

3.7.3.1 функции распределения [основные.НТЦ.активный.распределение]

[..] Функция выделения должна быть функцией-членом класса или глобальной функцией; программа плохо сформирована, если функция выделения объявлена в области пространства имен, отличной от глобальной области, или объявлена статической в глобальной области. [..]

Вышеуказанное ограничение, вероятно, налагается для та самая причина, на которую указывает ответ @sharptooth.

Это не допускается, потому что это не имеет смысла. Например, у вас есть следующие

int* ptr = 0;

namespace X {
    void* operator new (size_t);
    void operator delete(void*);
    void f()
    {
       ptr = new int();
    }
}

void f()
{
    delete ptr;
    ptr = 0;
}

Теперь как ptr должно быть deleted-с глобальным пространством имен operator delete() или с одним конкретным для namespace X? Для C++ нет никакого способа вывести это.