Brian W Kernighan & Dennis M. Ritchie
, 2e的C Programming Language
书,在第102-103页陈述如下:
…指针。如果p和q指向同一数组的成员,然后是==,!=,<,>=,等,工作正常。但是对于算术或,行为是未定义的与不指向相同成员的指针进行比较数组中。(有一个例外:第一个元素的地址数组的末尾可用于指针运算。
这个限制也适用于c++吗?我们有一些遗留代码,比较指针(特别是void*
)基于它们的绝对地址值,而不考虑它们是否属于同一个数组,我担心我们是否需要重新访问该代码。
是。嗯,未指定而不是未定义,这样更安全。
转换为int_ptr
是一个保证的往返过程。当指定<
时,保证std::less<>{}( a, b )
的行为良好并与<
保持一致。
这个未指定的行为允许三种情况。
- 原为分段内存;指针可以忽略段并更快地进行比较。
- 现在,它允许某些优化。比如假设比较指针以某种方式派生。如果违反了假设,编译器可以返回任何值。
- 在常量求值代码中阻止这种比较。
然而,当您违反该规则时,大多数编译器并不会立即崩溃。所以这不是一个非常重要的修复。至少有一个编译器实际上实现了更少的原始<
。