关于整数存入void指针的往返安全性及断言有效性的标准确认
你的理解完全正确!
咱们先把C++标准里关于reinterpret_cast在指针和整数之间转换的核心规则掰扯清楚:
- 标准只单向保证一种往返转换的有效性:如果你把一个有效的指针值转换为
intptr_t(或者其他足够大的整数类型),再把这个整数转换回原来的指针类型,得到的指针必须和原指针完全相等。 - 但反过来的情况——也就是把一个整数(哪怕是
intptr_t类型的)转换为指针,再转回到整数——标准没有任何保证,完全是实现定义的行为。
回到你贴的这段代码:
intptr_t x = 5; void* y = reinterpret_cast<void*>(x); assert(x == reinterpret_cast<intptr_t>(y));
这里存在两个关键问题:
- 第一步
reinterpret_cast<void*>(x):把整数5转成void*,标准不保证这个转换是合法的——有些平台可能不允许非指针来源的整数直接转成指针(比如5可能对应一个无效的内存地址,或者平台的指针编码规则不支持这个值),这一步本身就是由编译器实现决定行为。 - 第二步转回
intptr_t:就算第一步转换成功了,标准也没规定转回来的整数必须等于原来的5。正如你提到的,同一指针在不同实现里可能对应多种整数表示,反过来的转换自然也无法保证还原出初始的整数值。
所以你认为这段代码的行为不被C++标准保证,这个判断是完全准确的。
内容的提问来源于stack exchange,提问作者zse
相关产品推荐
相关产品推荐

