Сравните указатели void в constexpr

В С++:

  1. Можно преобразовать указатели в void*без гипса
  2. Это нормально иметь 1-прошлый конец указателя, если вы не разыменовываете его.
  3. Можно сравнивать указатели с ==а также !=даже если они указывают на несвязанные объекты.

В этом случае, почему это не скомпилируется:

      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;
      |         ~~~^~~~~

Ни то, ни другое не особенно полезно. Насколько я могу судить, никакого УБ здесь нет. Есть ли способ сравнить эти указатели на равенство, не расстраивая компиляторы?

0 ответов

Другие вопросы по тегам