(Примечание: этот вопрос был мотивирован, пытаясь придумать хакерство препроцессора, чтобы генерировать распределение без операции для ответа на этот другой вопрос:
Макрос, который принимает новый объект
... так имейте это в виду!)
Здесь надуманный класс:
class foo {
private:
int bar;
public:
foo(int bar) : bar (bar)
{ std::cout << "construct foo #" << bar << std::endl; }
~foo()
{ std::cout << "destruct foo #" << bar << std::endl; }
};
... который я буду выделять следующим образом:
// Note: for alignment, don't use char* buffer with new char[sizeof(foo)] !
void* buffer = operator new(sizeof(foo));
foo* p1 = new (buffer) foo(1);
foo* p2 = new (buffer) foo(2);
/* p1->~foo(); */ /* not necessary per spec and problematic in gen. case */
p2->~foo();
В gcc у меня есть "ожидаемый" результат:
construct foo #1
construct foo #2
destruct foo #2
Это здорово, но может ли компилятор/среда выполнения отклонить это как злоупотребление и все еще быть в правой части спецификации?
Как насчет потоковой передачи? Если на самом деле мы не заботимся о содержимом этого класса (пусть это все-таки фиктивный объект), то он, по крайней мере, не потерпит крах, например, в еще более простом приложении, которое мотивировало это с помощью POD int?