#include <iostream>
using namespace std;
int main(void) {
cout << 2["abc"] << endl;
return 0;
}
$ g++ test.cpp -o test
$ ./test
c
C ++语法是什么?它为什么有效?有人可以解释一下吗?
答案 0 :(得分:7)
因为a[b]
是*(a + b)
1 且b[a]
是*(b + a)
,+
是可交换的。
1 除非超载和其他恶作剧。
答案 1 :(得分:3)
在您的情况下,窄字符串文字基本上是 const字符数组。这使得:
cout << 2["abc"] << endl;
与
相同cout << "abc"[2] << endl;
部分引用(强调我的):
...一个狭窄的字符串文字的类型为 “n const char数组” ......
后缀表达式后跟方括号中的表达式是a 后缀表达。 其中一个表达式应为类型的glvalue “T”数组 或类型为“T指针”的prvalue,另一个应为无范围枚举的prvalue或 整数类型 即可。结果是 类型“T”......
注意:它仅适用于数组。当你这样做时:
struct Foo
{
Foo& operator[](std::size_t index) { return *this; }
};
Foo foo;
下面会有效,因为它实际上正在调用foo.operator[] (2)
;
Foo f;
f[2]; //Calls foo.operator[] (2);
下面的代码不起作用,因为其中一个表达式不是数组,因此编译器会继续查找合适的2.operator[] (foo)
,因为整数类型} em>没有会员功能。
2[f]; //will not work