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

eje*_*211 7 c++ pointers dereference

我刚试过这段代码:

int i = 33;
int * pi = &i;
cout << "i: " << *pi << endl;
cout << "i: " << pi[0] << endl;
Run Code Online (Sandbox Code Playgroud)

两条线都返回同样的东西.

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

每次在C++中取消引用指针时,不会得到索引零也有效吗?我并不是说任何人都应该这样做,但我认为它会起作用.不是吗?

T.C*_*.C. 11

忽略重载运算符,有一种情况存在差异,并且这是DR1213后的数组rvalues:

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
Run Code Online (Sandbox Code Playgroud)

但是,我不知道任何实现该解决方案的编译器.但最终应该实施.


Ale*_*exD 7

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

[C] 6.5.2.1数组下标:

E1[E2] 是完全相同的 (*((E1)+(E2)))

[C++] 5.2.1订阅:

表达式E1[E2](根据定义)与*((E1)+(E2))... 相同,除了在数组操作数的情况下,如果该操作数是左值,则结果是左值,否则是x值.

见伟大的答案@TC关于最后一部分.