将 C 风格的转换更改为 static_cast 总是安全的吗?

Is it always safe to change a C-style cast to a static_cast?

由于 cppcheck cstyleCast 样式警告,我正在尝试消除代码库中的所有 C 样式转换。

将 C 风格转换为 static_cast 总是安全的吗?

安全的意思是,是否存在旧的 C 风格转换可以正常工作,但 static_cast 会引发错误或未定义行为的情况?

type1 a;
type2 b = (type2)a;               // C style cast
type2 b = static_cast<type2>(a);  // Is this always a valid replacement for above cast?

C 风格转换通常是 static_cast<>reinterpret_cast<>const_cast<> 的组合。仅用 static_cast<> 替换它可能会出现编译时错误。

我不知道有任何运行时错误的案例。

您可以从 static_cast<> 开始,然后在出现编译时错误的地方添加(或替换为)const_cast<>。如果在那之后您仍然有编译时错误,则需要 reinterpret_cast<>。但不要盲目地进行替换——其中一些情况可能是错误。例如,如果数据类型是前向声明但未定义的,则可能需要 reinterpret_cast<>,这会导致未指定的行为(如果涉及多重继承,肯定会导致问题)。

发现这些类型的错误是此练习提高源代码安全性的原因,也是静态代码分析器标记 C 样式转换的原因。

C 风格转换和 static_cast 不等价。

is there a situation where the old C-style cast would work fine, but static_cast would raise error or undefined behavior?

举个例子:

int main() {
    using FI = int(*)();
    using FV = void(*)();
    FI fi = nullptr;
    FV fv = (FV)fi;
    //FV fv2 = static_cast<FV>(fi);
}

如果取消注释使用 static_cast 的行,代码将不会编译。
作为旁注,在这种情况下你应该使用 reinterpret_cast.