6

static_cast不会抛出异常。但如果它不成功,它将产生一个未定义的结果。检查演员表是否成功的最正确方法是什么?

这会有帮助吗?

NewType new_typ_obj = static_cast<NewType>(obj); 

if (new_typ_obj)
    new_typ_obj.do();
4

4 回答 4

10

static_cast不会为您提供有关成功的信息。如果您需要进行动态类型转换,请使用 dynamic_cast 或 boost any 之类的库。

于 2013-04-22T12:22:40.797 回答
7

在您给出的示例中,这static_cast 可能会根据所涉及的类型引发异常,例如,如果NewTypethrows 的构造函数。如果不存在从 to 类型的任何转换链objNewType那么它甚至不会编译。

您可能正在考虑使用static_cast将指向基址的指针转换为指向派生的指针,这是dynamic_cast检查的情况。没有办法判断static_cast在这种情况下是否成功。作为程序员,您有责任仅在正确的情况下使用它。

于 2013-04-22T12:24:12.320 回答
4

static_cast仅当您在指针、引用或指向成员类型的指针之间进行强制转换时,A才具有未定义的行为。当您对不是真正指向的对象类型的类型执行向下转换时,就会发生这种情况。

在您的示例中,除非NewType是指针或引用类型的 typedef 并且obj也是这些类型,如果强制转换无效,编译器会给您一个错误。

在任何情况下,表演if (new_typ_obj)对于检查演员表是否成功都是没有意义的static_cast。如果NewType不是这些多态类型之一,那么仅当您有某种方式将其转换为(或它)时,new_type_obj用作条件才有效。即便如此,也与演员无关。相反,如果您通过指向继承层次结构的指针进行 ing,则不会向您提供有关它是否成功的任何信息。为此,您想要.bool boolstatic_caststatic_castdynamic_cast

于 2013-04-22T12:26:19.367 回答
1

static_cast如果您要转换的类型与您要转换的类型无关,则不会编译。除了与void *所有类型有关。因此 static_cast 在编译时仍然是一个很大的保证。

仍然存在做错事的危险。

我个人的规则是:

  • 更喜欢使用 static_cast 进行向上转换,(显示意图)
  • 更喜欢使用 dynamic_cast 进行向下转换,并检查返回值。

如果 downcast 的 static_cast 没有危险,则可以取消后一条规则。

于 2013-04-22T12:29:40.380 回答