Может ли C ++ 0x по-прежнему явно выделять память с помощью глобального оператора new?

Википедия утверждает:

Тип можно сделать невозможным для выделения с помощью оператора 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;
}

17
задан 1 October 2010 в 10:52
поделиться