使用“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.
鉴于 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.