为什么(1 + 3)[a]与[1 + 3]相同?

KcF*_*nMi 1 c++

在研究18个基本C++面试问题时,我发现了一个带有以下(奇怪)声明的问题:

std::cout << (1 + 3)[a] - a[0] + (a + 1)[2];
Run Code Online (Sandbox Code Playgroud)

然后答案解释了,(1+3)[a] is the same as a[1+3]这对我来说仍然很奇怪.

我可以问一下这个历史吗?为什么会如此以及如何允许这样做呢?

Bri*_*ian 14

在C中,a[i]定义为*(a + i).根据这个定义,您可以看到a[i]并且i[a]意味着同样的事情.

C++从C继承了这个"特性",但请注意在C++中:

  • i[a]a[i]如果他们不调用重载运算符,那只是意思相同; 例如,如果a有类型,您发布的代码将无效std::vector<int>.
  • 在C++ 14及更高版本中,由于前者并不总是左值,a[i]因此不相同*(a + i).

  • @AlexTelon a [i]是[_xvalue_](http://en.cppreference.com/w/cpp/language/value_category#xvalue),如果a是数组_rvalue_.另请参见[built-in_subscript_operator](http://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_subscript_operator). (2认同)