I don't see how the [2] is the confusing part. It may not be immediately obvious, because pointers to pointers suck, but you're telling it to allocate an array of two pointers. This doesn't look awkward does it? int** ptrtoptr= newint*[2] If anything all of the extra braces making them into function pointers are what make your eyes want to cross over.
It's just that people are used to seeing the square brackets on the right, as in new SomeComplexType[2];, instead of deep inside the declarator. The ones on the right might not have much to do with it at all:
1 2
auto p = new (int (*(*[2])())[3]); // array of two pointers
delete[] p;