在 C++ 中,取消引用和获取索引零做同样的事情吗?

In C++, do dereferencing and getting index zero do the same tihng?

我刚试过这段代码:

int i = 33;
int * pi = &i;
cout << "i: " << *pi << endl;
cout << "i: " << pi[0] << endl;

两行return相同。

本质上,如果我获得任何指针的索引零,我将在指针位置获得正确类型的值。这与取消引用不是一回事吗?

每次在 C++ 中取消引用指针时,获取索引零是否也有效?我不是建议任何人实际上应该 ,但我认为它会 工作 。不会吧?

假设没有运算符重载,它们几乎相同。

[C] 6.5.2.1 数组下标:

E1[E2] is identical to (*((E1)+(E2)))

[C++] 5.2.1 下标:

The expression E1[E2] is identical (by definition) to *((E1)+(E2)) ... , except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise.

参见 @T.C 的伟大 关于最后一部分。

对于指针,它们应该给出相同的结果。

它们唯一可能不同的情况是,如果您将它们应用于以不同方式重载 operator*()operator[](int) 的用户定义类型(或者一个而不是另一个,在这种情况下,您会出现编译错误)。

忽略重载运算符,有一种情况是有区别的,那就是数组右值post-DR1213:

using arr = int[2];
arr&& f();
int&& b = *f(); // error, *f() is an lvalue, doesn't bind to int&&
int&& c = f()[0]; // OK, subscript applied to array rvalue results in an xvalue

不过,我不知道有任何编译器实现了该解决方案。不过最终应该会实现。