Die Array-Indizierung ist kumulativ. Siehe this und this.
In Ihrem Fall schmaler Stringliterale ist im Grunde const Array von Zeichen. Das macht:
cout << 2["abc"] << endl;
gleiche wie
cout << "abc"[2] << endl;
Zur teilweisen Zitat (Hervorhebung von mir):
[lex.string/8]
... Ein schmaler Stringliteral hat Typ „Array von n const char“ ...
[expr.sub/1]
A Postfix Ausdruck durch einen Ausdruck in eckigen Klammern ist eine Postfix-Expression. einer der Ausdrücke soll ein glvalue vom Typ „array of T“ oder ein prvalue des Typs „Zeiger auf T“ sein, und die andere wird eine prvalue von unscoped Enumeration oder integralen Typ sein. Das Ergebnis ist vom Typ „T“ ....
Hinweis: es funktioniert nur für Arrays. Wenn Sie das tun:
struct Foo
{
Foo& operator[](std::size_t index) { return *this; }
};
Foo foo;
Im Folgenden wird die Arbeit arbeiten, weil seine tatsächlich foo.operator[] (2)
Aufruf;
Foo f;
f[2]; //Calls foo.operator[] (2);
wird im Folgenden nicht arbeiten, weil einer der Ausdrücke ist nicht ein Array, damit der Compiler geht eine geeignete 2.operator[] (foo)
zu finden, die wegen integrale Typen versagen keine Mitgliederfunktionen haben.
2[f]; //will not work
Nur weil es funktioniert, bedeutet nicht, dass Sie es verwenden sollten. – DeiDei
Nur weil Sie es nicht benutzen sollten, heißt das nicht, dass Sie nicht fragen sollten, warum es funktioniert. – rightfold
nur weil ich frage, warum es funktioniert, habe ich es herausgefunden Vielen Dank an alle !! – neo1218