C++标准pointer-interconvertible定义提及reinterpret_cast:笔误还是有依据?
reinterpret_cast? 这不是笔误,标准的表述是有意为之,核心原因在于C++类型系统的设计逻辑和对转换意图的明确性要求:
1. reinterpret_cast是指针类型转换的“直接合法路径”
pointer-interconvertible的定义强调reinterpret_cast,是因为它是无需通过void*中转的直接指针转换方式,专门用于处理“类型不同但地址相同”的对象指针转换场景。这种直接转换的语法,精准匹配了pointer-interconvertible的本质——两个对象共享内存地址,但类型系统视角下属于不同类型。
2. static_cast的规则是间接覆盖,并非专门设计
标准中static_cast章节关于void*转换的描述,是针对通用指针转换的规则,只是恰好覆盖了pointer-interconvertible的场景。而reinterpret_cast等价于static_cast<T*>(static_cast<void*>(p))的规则,只是大多数平台下的行为等价,并非语义上完全一致——reinterpret_cast的语义是“绕过类型系统直接转换”,而static_cast的语义是“基于类型兼容性的合法转换”。
3. 历史演进与表述严谨性
在C++标准的发展中,reinterpret_cast从诞生起就被定位为处理“类型不兼容但内存布局兼容”的转换,而static_cast更多用于类型层次内的转换、基本类型转换等合法兼容场景。将reinterpret_cast写入pointer-interconvertible的定义,是为了明确这种转换的合法性依据,避免开发者混淆两种转换的语义边界。
实际编程建议
虽然两种转换方式在pointer-interconvertible场景下都合法,但优先推荐使用static_cast(通过void*中转),因为它更符合C++类型系统的设计理念,编译器能提供更多潜在的检查;而reinterpret_cast应作为显式表达“绕过类型系统”意图的工具,仅在必要时使用。
内容的提问来源于stack exchange,提问作者Oersted

