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";
}