Сравните указатели void в constexpr
В С++:
- Можно преобразовать указатели в
void*
без гипса - Это нормально иметь 1-прошлый конец указателя, если вы не разыменовываете его.
- Можно сравнивать указатели с
==
а также!=
даже если они указывают на несвязанные объекты.
В этом случае, почему это не скомпилируется:
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;
И ГЦК говорит:
error: '(((void*)(&& test::a[1])) == ((void*)(& b)))' is not a constant expression
10 | if (pa == pb) res = 1;
| ~~~^~~~~
Ни то, ни другое не особенно полезно. Насколько я могу судить, никакого УБ здесь нет. Есть ли способ сравнить эти указатели на равенство, не расстраивая компиляторы?