What's the reason to have separate overloads for `new` and `new[]` named `operator new` and `operator new[]`? As they both are only used to allocate certain amount of memory - why would I want to write different code for each of them?