gpt4 book ai didi

c++ - 在生产代码中删除 dynamic_casts 是否安全?

转载 作者:可可西里 更新时间:2023-11-01 16:37:05 24 4
gpt4 key购买 nike

dynamic_cast 速度较慢,但​​它们比 static_cast 更安全(当然,当与对象层次结构一起使用时)。我的问题是,在我的调试代码中确保所有(动态)转换都是正确的之后,我是否有任何理由不将它们更改为 static_cast

我计划使用以下构造来执行此操作。 (顺便说一句,你能想到一个比 assert_cast 更好的名字吗?也许是 debug_cast?)

#if defined(NDEBUG)

template<typename T, typename U>
T assert_cast(U other) {
return static_cast<T>(other);
}

#else

template<typename T, typename U>
T assert_cast(U other) {
return dynamic_cast<T>(other);
}

#endif

编辑: Boost 已经为此准备了一些东西:polymorphic_downcast .感谢 PlasmaHH 指出这一点。

最佳答案

不! dynamic_cast 做的不仅仅是转换。它可以检查对象的运行时类型。但它也可以遍历编译器不知道但只在运行时才知道的层次结构。 static_cast 不能那样做。

例如:

class A1
{
virtual ~A1() {}
};
class A2
{
virtual ~A2() {}
};

class B : public A1, public A2
{ };

A1 *a1 = new B;
A2 *a2 = dynamic_cast<A2*>(a1); //no static_cast!

A1 *x = ...;
if (B *b = dynamic_cast<B*>(x)) //no static_cast!
/*...*/;

关于c++ - 在生产代码中删除 dynamic_casts 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7359664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com