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

Full emulation of `intptr_t` with `ptrdiff_t` and `nullptr`?

鉴于 intptr_t is optional and ptrdiff_t 是强制性的,p - nullptr 是否可以很好地替代 (intptr_t)p,从 n 表示的结果转换回 [=17] =] 而不是 (decltype(p))n?它在定义了 intptr_t 的实现上在语义上与 IIUC 等效,但也可以按预期工作。

如果我在上面是对的,为什么标准允许不实施 intptr_t?似乎由此提供的自由并不是特别有价值,只是一组两个简单的本地源代码转换(或优化的等效)来削减。

没有。 ptrdiff_t 只需要足够大以包含单个对象,而不是整个内存 space。并且 (char*)p - (char*)nullptr causes undefined behavior 如果 p 本身不是空指针。

p - nullptr 没有强制转换 is ill-formed.