оператор новый внутри пространства имен - PullRequest
7 голосов
/ 02 июня 2011
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 ]

9 голосов
/ 02 июня 2011

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

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 должно быть delete d - с глобальным пространством имен operator delete() или с конкретным для namespace X?Для C ++ нет никакого способа сделать это.

6 голосов
/ 02 июня 2011

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

3.7.3.1 Функции распределения [basic.stc.dynamic.allocation]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...