必须用 static_cast 而非 c 风格转换的情况包括:数值类型转换、有定义转换函数的类类型转换、向上转型(非虚继承)、void* 到具体类型指针;c 风格转换会隐式调用 const_cast 等,破坏类型安全。

什么时候必须用 static_cast,而不是 C 风格强制转换?
因为 C 风格转换((int)x 或 int(x))会绕过类型安全检查,可能隐式触发 const_cast、reinterpret_cast 甚至 dynamic_cast,而你完全察觉不到。比如把 const int* 转成 int*,C 风格写法看起来只是“去 const”,实际却偷偷调用了 const_cast —— 这在大型项目里极难追踪。
static_cast 明确限定在编译期可判定的合法转换范围内,例如:
- 数值类型间转换(
double→int,但会截断) - 有明确定义转换构造函数或
operator T()的类类型转换 - 向上转型(派生类指针 → 基类指针),且基类非虚继承时安全
- void* → 具体类型指针(需确保地址确实指向该类型对象)
错误示例:static_cast<derived>(base_ptr)</derived> —— 向下转型不能用 static_cast,它不检查运行时类型,结果是未定义行为。
dynamic_cast 能用在哪些场景?它为什么慢?
dynamic_cast 只对含虚函数的多态类型有效,本质依赖 RTTI(Run-Time Type Information)。它用于安全的向下转型或跨继承关系的横向转型,比如从基类指针转回具体派生类指针。
立即学习“C++免费学习笔记(深入)”;
常见使用条件:
- 源类型和目标类型都必须是多态类(即至少有一个虚函数)
- 只能用于指针或引用;对指针转型失败返回
nullptr,对引用失败抛出std::bad_cast - 若继承关系中存在虚基类,
dynamic_cast仍能正确调整指针偏移,这是static_cast做不到的
性能代价来自:每次调用都要查虚表获取类型信息,再比对 type_info。在 hot path(如循环内)频繁使用会明显拖慢速度。某些嵌入式或游戏引擎会禁用 RTTI,此时 dynamic_cast 直接不可用。
为什么 reinterpret_cast 是最后手段?
它告诉编译器:“别管类型,按字节重新解释这块内存”。这不是类型转换,而是位模式重读。典型用途极少,例如:
- 把指针转成整数做哈希或调试打印(
uintptr_t p = reinterpret_cast<uintptr_t>(ptr)</uintptr_t>) - 实现底层序列化/反序列化时临时绕过类型系统(但应严格限定作用域)
- 对接硬件寄存器或特定 ABI 接口(如 Windows HANDLE 实际是 void*)
危险点在于:它完全不保证可移植性。x86_64 上 sizeof(void*) == sizeof(uintptr_t),但某些平台不成立;将 int* 强转为 float* 再解引用,可能触发未定义行为(违反 strict aliasing 规则)。
如何判断该用哪个 cast?一个快速决策树
先看是否涉及多态类型和运行时类型检查需求:
- 需要安全向下转型?→ 用
dynamic_cast(前提是类有多态性) - 只是数值转换、向上转型、或已知类型兼容?→ 用
static_cast - 要抹掉 const/volatile?→ 必须用
const_cast,不能用其他 cast 替代 - 以上都不行,且你清楚自己在做什么、目标平台、对齐和 ABI?→ 才考虑
reinterpret_cast
真正容易被忽略的是:很多看似“简单”的指针转换(比如 char* 到结构体指针),其实属于 reinterpret_cast 场景,但开发者常误用 static_cast 并侥幸通过编译——这在开启严格优化(如 -O2)后可能因 aliasing 优化导致静默错误。











