C++ static_cast和implicit_cast

本文探讨了muduo库中implicit_cast与static_cast的区别,通过对比测试代码,揭示了两者在类型转换上的安全性差异。implicit_cast仅允许向下转型,提供更严格的类型检查,适合在需要确保类型安全的场景下使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题来源:

此问题来源于muduo库代码的学习过程中,在muduo/base/Types.h文件中的第62行,如图:
在这里插入图片描述

后续代码:
在这里插入图片描述

这段话是说,使用implicit_cast作为static_castconst_cast的安全版本。

看到第112行,我有了一个疑惑:
static_cast也会进行类型检查,为什么要自定义一个隐式转换,而不是直接使用static_cast呢?
这段注释说implicit_caststatic_cast安全,更安全体现在哪里呢?

解决

还是试一下吧,有如下的测试代码:

template<typename To, typename From>
inline To implicit_cast(From const &f)
{
  return f;
}

class A {};

class B : public A {};

class C {};

int main() {

    A a;
    A* p1 = &a;

    B b;
    B* p2 = &b;

    A* p3 = &b;

    //基类指针转子类指针
    implicit_cast<B*>(p1);//不通过
    static_cast<B*>(p1);//通过

    //子类指针转基类指针
    implicit_cast<A*>(p2);//通过
    static_cast<A*>(p2);//通过

    //指向子类对象的基类指针转子类指针
    implicit_cast<B*>(p3);//不通过
    static_cast<B*>(p3);//通过

    //不相干类型的指针转换
    implicit_cast<C*>(p1);//不通过
    static_cast<C*>(p1);//不通过

    //试图去除底层const属性
    const B* p4 = &b;
    implicit_cast<A*>(p4);//不通过
    static_cast<A*>(p4);//不通过

    return 0;
}

总结

从编译结果可以看出,二者都会进行类型检查,禁止不相关的类型转换以及试图去除const的转换。
static_cast允许向上、向下转型,而implicit_cast只允许向下转型。

所以说在这种情况下,使用implicit_cast更合适。

尽管有时候想要用指向子类对象的基类指针向下转型,但static_castimplicit_cast都只判断其静态类型,如果有这个需求,那就使用把static_cast包装后的down_cast

为什么不使用dynamic_cast?1. 有额外开销;2. 尽量用static_cast作为替代。由于多继承的存在,有些情况无法避免使用dynamic_cast。

2020/04/02 19:46
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值