static_cast与reinterpret_cast差异及C++代码命题等价性咨询
C++命题2与命题4等价性判断
首先明确两个命题对应的转换规则:
- 命题2:尝试用
static_cast将nullptr(std::nullptr_t类型)直接转换为无符号长整型V,该转换不符合static_cast的语法要求,代码无法编译。 - 命题4:将
char类型指针U*先通过static_cast转为void*,再通过static_cast转为int类型指针T*,该转换符合C++标准对static_cast的定义,代码可正常编译。
二者完全不等价,核心差异如下:
- 转换场景完全不同:命题2属于空指针常量到整数的跨类别转换,命题4属于不同对象指针类型通过
void*中转的同类别转换,属于完全无关的两类类型转换场景。 - 合法性判断逻辑无关联:命题2编译失败的原因是
static_cast的合法转换列表中,不包含std::nullptr_t到非布尔、非指针类型整数的直接转换规则;命题4编译成功的原因是static_cast显式支持void*与任意对象指针类型的双向转换,二者的判断依据没有任何重叠。 - 合法实现的要求不同:命题2对应的转换如果要合法,必须使用
reinterpret_cast或者C风格强制转换;命题4对应的转换不需要用到reinterpret_cast,仅靠static_cast就能完成标准允许的合法转换。
内容的提问来源于stack exchange,提问作者Etienne M
相关产品推荐
相关产品推荐

