C++ 几种新增类型转换的区别 + 标准库模板函数

四大关键字

  • static_cast 大多数转换,包括左右值转换、父子类指针/引用之间的转换(不进行安全检查,但会修正指针偏移)。
  • const_cast 也能进行 volatile 属性的修改!!
  • dynamic_cast 父子类指针/引用之间的转换。其中子类转向基类相当于使用 static_cast ,没有运行时安全检查。而基类转向子类则有运行时安全检查,而且要求基类是多态类,否则无法编译。
  • reinterpret_cast

标准库的共享指针转换模板

标准库中还有针对于 std::shared_ptr 的类型转换模板。转换后返回一个共享指针,但其包裹的类型被转换成了对应的类型:

  • std::static_pointer_cast
  • std::const_pointer_cast
  • std::dynamic_pointer_cast

注意:这种转换算作指针的复制,所以共享指针对应的控制块引用计数加一(如果指针非空)。

举例:

struct A    {};
struct B: A {};
auto sp = std::make_shared<B>();
if (auto sp2 = std::dynamic_pointer_cast<A>(sp)) {
    std::cout << "success\n";
}