【发布时间】:2011-12-02 23:25:17
【问题描述】:
我很想知道在禁用 RTTI 的情况下使用动态转换编译代码时会发生什么
(在 GCC 上使用 -fno-rtti 或在 Visual Studio 上使用 /GR-)。编译器是否“回退”到 static_cast ?由于(至少在 VS 上)它只会发出警告,那么编译后的代码会做什么?
更具体地说,如果我在没有 RTTI 的情况下编译一个我确信 dynamic_cast 不会出错的代码(即 dynamic_cast 可以安全地被 static_cast 替换),会发生什么坏事:
class A{ /*...*/ } ;
class B : public A {
int foo() { return 42 ;}
} ;
//...
A * myA = new B() ;
int bar = (dynamic_cast<B*>(myA))->foo() ;
【问题讨论】:
-
为什么不试试呢?
-
如果您确定可以使用
static_cast,为什么您的代码使用dynamic_cast? -
@edA-qamort-ora-y :我知道这样更好(实际上这是我对违规代码所做的),我只是想知道会发生什么
-
@EranZimmerman :我发现抛出了 std::__non_rtti_object ,但仅在某些情况下(我仍然不知道为什么)
-
@EranZimmerman 想知道这在任何平台和编译器上是否总是有效,而不是在切换编译器时准备一颗准备爆炸的定时炸弹。
标签: c++ rtti dynamic-cast