2
#include <iostream>

using namespace std;

int main(void) {
    cout << 2["abc"] << endl;
    return 0;
}

$ g++ test.cpp -o test
$ ./test
c

What the C++ syntax is? Why it work? Can someone explain it?

Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
neo1218
  • 55
  • 7

2 Answers2

7

Because a[b] is *(a + b)1 and b[a] is *(b + a), and + is commutative.

1 unless overloaded and other shenanigans.

3

Array indexing is cummutative. See this and this.

In your case, narrow string literals are basically const array of characters. Which makes:

cout << 2["abc"] << endl;

same as

cout << "abc"[2] << endl;

To partially quote (emphasis mine):

[lex.string/8]

...A narrow string literal has type “array of n const char”...

[expr.sub/1]

A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall be a glvalue of type “array of T” or a prvalue of type “pointer to T” and the other shall be a prvalue of unscoped enumeration or integral type. The result is of type “T”....


Note: it only works for arrays. When you do:

struct Foo
{
    Foo& operator[](std::size_t index) { return *this; }
};

Foo foo;

Below will work work because its actually calling foo.operator[] (2);

Foo f;
f[2];    //Calls foo.operator[] (2);

Below will not work because, one of the expressions is not an array, hence the compiler proceeds to find a suitable 2.operator[] (foo), which would fail because integral types have no member functions.

2[f];   //will not work
Community
  • 1
  • 1
WhiZTiM
  • 21,207
  • 4
  • 43
  • 68