That's nonsense. This "requirement" is derived from the requirement of aligned storage, but "new char[sizeof(Foo)]" is no more guaranteed to be suitably aligned for Foo than "char buffer[sizeof(Foo)]". By the letter of the standard, anyway. However, operator new is required to return storage aligned for any type, so in practice this is a non-issue for new.
For the stack, you have to align the memory. You do that either by over-allocating and adjusting the address:
Or by making sure the alignment is right in the first place.Code:char buffer[sizeof(Foo) + alignof(Foo) - 1];
new ((buffer + alignof(Foo) - 1) % alignof(Foo)) Foo;
Code:typedef ... type_with_foo_alignment;
union { type_with_foo_alignment aligner; char mem[sizeof(Foo)]; } buffer;
new (buffer.mem) Foo;