在 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
不过,我不知道有任何编译器实现了该解决方案。不过最终应该会实现。
我刚试过这段代码:
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
不过,我不知道有任何编译器实现了该解决方案。不过最终应该会实现。