是C++标准中的int [指向数组的指针]?

sty*_*fly 9 c++ arrays syntax pointers subscript-operator

据我所知,可以编写以下代码:

char *a = new char[50];
for (int i = 0; i < 50; ++i) {
    i[a] = '5';
}
Run Code Online (Sandbox Code Playgroud)

它汇编.有用.它完全一样

char *a = new char[50];
for (int i = 0; i < 50; ++i) {
    a[i] = '5';
}
Run Code Online (Sandbox Code Playgroud)

是因为:

  • a[b]*(a + b)默认情况下实现为宏,并且两个代码示例都有效的事实只是一个事故/编译器特定的事实
  • 它在某处标准化,并且这些算法的结果在每个平台上应该是相同的

可以合理地假设添加应该是可交换的,但是如果我们operator[]以这种方式实现,我们已经做了其他可交换的东西,可能不是我们想要的东西.

有趣的是,没有pointer[pointer]运营商,因此operator[]不是宏.

我知道这很糟糕.我知道阅读代码的人会感到困惑.但是我想知道这是不是偶然发生,它不会在一个遥远的地方工作,那里的独角兽有七条腿,而左边的脸颊上有角.

use*_*016 12

C++标准,§8.3.4,注7(第185页)(强调我的).

除非为类(13.5.5)声明它,否则下标运算符[]的解释方式E1[E2]*((E1)+(E2)).由于适用的转换规则+,if E1是数组和E2整数,因此E1[E2]引用的是E2-th成员E1.因此,尽管它的外观不对称,下标是可交换操作.