3

在 C++ 中:

  1. void*无需强制转换即可将指针转换为
  2. 只要您不取消引用它们,就可以使用 1-past-end 指针
  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;

GCC 说:

 error: '(((void*)(&& test::a[1])) == ((void*)(& b)))' is not a constant expression
   10 |     if (pa == pb) res = 1;
      |         ~~~^~~~~

两者都不是特别有用。据我所知,这里不涉及 UB。有没有办法在不扰乱编译器的情况下比较这些指针是否相等?

4

0 回答 0