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