2016-12-30 86 views
2
#include <iostream> 

using namespace std; 

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

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

C++语法是什么?为什么它工作?有人可以解释吗?cout << 2 [“abc”] << endl;为什么它工作?它的语法是什么?

+2

只是因为它的作品,并不意味着你应该使用它。 – DeiDei

+1

仅仅因为你不应该使用它,并不意味着你不应该问它为什么会起作用。 – rightfold

+1

只是因为我问为什么它的作品,我想出来谢谢大家! – neo1218

回答

7

a[b]由于是*(a + b)b[a]*(b + a),并+是可交换的。

除非重载和其他shenanigans。

3

数组索引是累积性的。见thisthis

在你的情况下,窄字符文字基本上是const字符数组。这使得:

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

一样

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

为了部分报价(重点矿山):

[lex.string/8]

...窄字符串字面量的类型为“N常量字符的数组” ...

[expr.sub/1]

后缀表达式,随后在方括号中的表达式为 后缀表达式。 表达式的一个应类型的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),这会失败,因为整型没有成员函数。

2[f]; //will not work 
相关问题