Just out of curiosity, is the following legal?
X* p = static_cast(operator new[](3 * sizeof(X)));
new(p + 0) X();
new(p + 1) X();
new(p + 2) X();
I think that cannot be legal. Because that implies these equations:
new-expression = allocation-function + constructor
delete-expression = destructor + deallocation-function
Nothing more, nothing less. But the Standard does not say exactly that, as far as I know. It might be possible that new-expression does more than allocation-function + constructor together do. That is, the actual equations could be this, and the Standard doesn't forbid it explicitly anywhere:
new-expression = allocation-function + constructor + some-other-work
delete-expression = destructor + deallocation-function + some-other-work