在 C++ 中:
void*
无需强制转换即可将指针转换为- 只要您不取消引用它们,就可以使用 1-past-end 指针
- 即使指针指向不相关的对象,也可以将指针与
==
它们进行比较。!=
在那种情况下,为什么编译失败:
consteval int test() {
int* a = new int(42);
long* b = new long(43);
void* pa = &a + 1;
void* pb = &b;
int res = 0;
if (pa == pb) res = 1;
delete a;
delete b;
return res;
}
int main() {
return test();
}
铿锵声 说:
subexpression not valid in a constant expression
if (pa == pb) res = 1;
GCC 说:
error: '(((void*)(&& test::a[1])) == ((void*)(& b)))' is not a constant expression
10 | if (pa == pb) res = 1;
| ~~~^~~~~
两者都不是特别有用。据我所知,这里不涉及 UB。有没有办法在不扰乱编译器的情况下比较这些指针是否相等?