翻译自 stackoverflow
static_cast
static_cast 是要执行 cast 时的首选,static_cast 所做的事情类似于类型之间的隐式转换,例如 int -> float, pointer -> void *, 它也可以显式或隐式地调用转换函数。许多情况下,显式声明 static_cast 并没有必要。但是必须注意 T(something) 等同于 (T) something, 并且应当避免这样的语法。T(something, something_else)则是安全的,承诺会调用构造函数。
static_cast 能用于继承关系中的 cast,没有必要朝基类向上cast,但是只要不是虚拟继承,则可以向下 cast。如果向下 cast 到一个不是该对象类型的类型,不作检查,行为未定义。
const_cast
const_cast 用于移除或增加变量的 const 属性,任何其他的 C++ cast 都无法移除 const (即使是 reinterpret_cast 也不例外)
翻译自 stackoverflow
const_cast 用来移除指针或引用的 const 属性,指向非 const 的变量,不能用于原本就是 const 的变量,否则将导致不确定的行为。
下面的写法是 ok 的,因为变量 i 原本就不是 const,所以可以改变。
// fine
int i = 0;
const int& ref = i;
const int* ptr = &i;
const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
而下面的这段 code 不允许,因为 i 是一个 const,而现在却被赋了一个新的值。code 可以编译通过,行为却是不确定的(可能会正常工作,也可能 crash)
// error
const int i = 0;
const int& ref = i;
const int* ptr = &i;
const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
dynamic_cast
dynamic_cast 几乎只用于处理多态,你可以将一个指针 cast 成任意多态类型,你可以向上cast, 向下cast,甚至向旁边cast,dynamic_cast 将找出所寻找的对象并返回,指针的情况下如果失败,返回nullptr, 如果是引用,则返回std::bad_cast.
reinterpret_cast
- 继承的体系结构中,用 dynamic_cast 转换指针/引用。
- 一般类型转换,用 static_cast。
- 比特模式的底层重解析,用 reinterpret_cast, 使用时要务必小心。
- 用 const_cast 移除(cast away) const/volatile, 除非是遇到的 API 的 const 不正确,否则要避免使用 const_cast。