使用“ptrdiff_t”和“nullptr”完全模拟“intptr_t”?

Byt*_*ter 1 c++ standards pointers integer type-conversion

鉴于intptr_t是可选的并且ptrdiff_t是强制性的,将p - nullptr是 的一个很好的替代品,从用with而不是?(intptr_t)p表示的结果转换回来。它在定义的实现上在语义上与 IIUC 等效,但也按其他方式工作。nnullptr + n(decltype(p))nintptr_t

如果我的上述说法是正确的,为什么该标准不允许不实施intptr_t?看来由此提供的自由并不是特别有价值,只是需要削减一组两个简单的本地源代码转换(或优化的等效项)。

Ben*_*igt 6

不需要。 ptrdiff_t只需要足够大以包含单个对象,而不是整个内存空间。如果本身不是空指针,则会(char*)p - (char*)nullptr 导致未定义的行为。p

p - nullptr没有演员表是不规范的。

  • @BenVoigt C 标准已经允许相同的内容:https://port70.net/~nsz/c/c11/n1570.html#6.5.6p9 和 https://port70.net/~nsz/c/c11/ n1570.html#7.19p2 没什么可说的,只是它是减指针的类型。 (2认同)
  • @chux-ReinstateMonica 是的,没关系。标准中有一个特定的情况(https://eel.is/c++draft/expr.add#5.1)类似地,允许将“0”添加到空指针值。然而,我认为 C 不允许其中任何一个,我注意到用“-fsanitize=undefined”编译时会破坏很多代码,因为从技术上讲,它需要在许多接受指针+长度的函数中进行特殊的大小写,以防两者都为空。 (2认同)