Википедия утверждает:
Тип можно сделать невозможным для выделения с помощью оператора new:
struct NonNewable { void * оператор new (std :: size_t) = delete; };
Объект этого типа может быть выделен только как объект стека или как член другого типа. Его нельзя напрямую выделить в куче без непереносимых уловок. (Поскольку размещение new - единственный способ вызвать конструктор в памяти, выделенной пользователем, и это использование было запрещено, как указано выше, объект не может быть должным образом сконструирован.)
Удаление оператора new аналогично тому, как сделать его закрытым в текущем C ++, но не использует явно глобальный оператор new, который позволяет избежать поиска по классам, все еще действителен C ++ 0x?
NonNewable *p = ::new NonNewable();
// neither non-portable nor trickery, though perhaps not widely known
Я что-то пропустил в черновике?
Чтобы было ясно, это допустимый C ++ 03 и работает нормально :
struct NonNewable {
private:
void *operator new(std::size_t); // not defined
};
int main() {
// ignore the leaks, it's just an example
void *mem = operator new(sizeof(NonNewable));
NonNewable *p = ::new(mem) NonNewable();
p = ::new NonNewable();
return 0;
}