Dynamic_cast主要用于执行“安全的向下转型”。也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制类型转换,也是唯一可能有重大运行时代价的强制转换。
Static_cast可以被用于强制类型转换(例如,non-const对象转换为const对象,int转换为double,等等),它还可以用于很多这样的转换的反向转换(例如,void*指针转换为有类型指针,基类指针转换为派生类指针)。但是它不能将一个const对象转换为一个non-const对象(只有const-cast能做到)。它最接近于C-style的转换。
Const_cast一般用于强制消除对象的常量性。它是唯一能做到这一点的C++风格的强制类型。
Reinterpret_cast是特意用于底层的强制转换,导致实现依赖(implementation-dependent)(就是说,不可移植)的结果。例如,将一个指针转型为一个整数。这样的强制转换在底层代码以外应该极为罕见。
旧风格的强制类型依然合法,但是新的形式更可取。首先,在代码中他们更容易识别(无论是人还是像grep这样的工具都是如此),这样就简化了在代码中寻找类型系统被破坏的地方的过程。第二,更精确地制定每一个强制转换的目的,使得编译器诊断使用错误成为可能。例如,如果你试图使用一个const_cast以为的新风格强制类型来消除常量性,你的代码将无法编译。