Older compilers allowed this kind of "blasphemy"
int a[5];
4[a] = 3;
Simply because operator[] would allow const expression and those are equal:
*(4 + a) === *(a + 4)
Is that a defined behavior or an UB in C++11?
Edit: answer:
Except where it has been declared for a class (13.5.5), the subscript operator [] is interpreted in such a way that E1[E2] is identical to *((E1)+(E2)). Because of the conversion rules that apply to +, if E1 is an array and E2 an integer, then E1[E2] refers to the E2-th member of E1. Therefore, despite its asymmetric appearance, subscripting is a commutative operation.