减去指针时的 C++ 未定义行为

Bik*_*eev 5 c++

C++ 标准从非数组元素中减去指针是 UB:

int a, b;
&a - &b; // UB, since pointers don't point to the same array.
Run Code Online (Sandbox Code Playgroud)

但是如果两个指针都被转换为 uintptr_t,那么两个表达式都不再是指针表达式,从标准的角度来看,减去它们似乎是合法的:

int a, b;
reinterpret_cast<uintptr_t>(&a) - reinterpret_cast<uintptr_t>(&b); 
Run Code Online (Sandbox Code Playgroud)

这是正确的还是我错过了什么?

Bat*_*eba 1

你是对的。

减去不指向同一数组元素的指针的行为是未定义的。为此,允许指针超出数组的最后一个元素,并且对象算作长度为 1 的数组。

但是,一旦您将指针转换为合适的类型,例如 a std::uintptr_t(假设您的编译器支持它;它不是必须的),您就可以对其应用任何您想要的算术,但要遵守该类型强加给您的约束。

尽管这些规则可能看起来很迟钝,但它们与类似的规则相关,即不允许读取指向有效内存的指针。所有这些都有助于实现该语言更大的可移植性。