在C++中,执行去引用和获取索引0的操作是相同的

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

本文关键字:索引 操作 获取 C++ 执行 引用      更新时间:2023-10-16

我刚刚尝试了这个代码:

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

两行返回的内容相同。

本质上,如果我得到任何指针的索引零,我就会在指针的位置得到正确类型的值。这不就是取消引用吗?

每次在C++中取消引用指针时,获取索引0不是也有效吗?我并不是建议任何人都应该这样做,但我认为这会起作用。不是吗?

忽略重载运算符,有一种情况是有区别的,那就是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

不过,我不知道有哪个编译器能实现这个解决方案。但它最终应该得到实施。

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

[C]6.5.2.1数组下标:

E1[E2](*((E1)+(E2))) 相同

[C++]5.2.1订阅:

表达式CCD_ 3与CCD_,除了在数组操作数的情况下,结果是如果该操作数为左值,则为左值;否则为x值。

请参阅@T.C关于最后一部分的精彩回答。

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

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