> You can't index element two of std::array foo as 1[foo] since it isn't an actual C array.
That's just a silly quirk of C syntax that is deliberately not modeled in C++ operator overloading. It's not a real capability; it doesn't make arrays "do" anything new, so it' hard to call it an array behavior. It's a compiler behavior, that's for sure.
It could easily be added to C++, similarly to the way preincrement and postincrement are represented (which allows that obj++ and ++obj to be separate overloads).
T &array_class::operator [] (int index) {
// handles array[42]
}
T &array_class::operator [] (int index, int) { // Fictional!!
// handles 42[array]
}
The dummy extra int parameter would mean "this overload of operator [] implements the flipped case, when the object is between the [ ] and the index is on the left".C++ could easily have this; the technical barrier is almost nonexistent. (I wonder what the minimal diff against GNU C++ would be to get it going.)
I suspect that it's explicitly unwanted.
That is predicated on equivalence to *(a + i) where a is a dumb pointer whose displacement commutes.
And even in Assembly, it depends on the CPU flavor which kind of memory accesses are available.
None of that changes what instruction is generated, just like C's quirk is one of pure syntax that doesn't affect the run-time.