C ++正确的static_cast方式

时间:2013-04-22 12:20:55

标签: c++ exception casting static-cast

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

这会有帮助吗?

NewType new_typ_obj = static_cast<NewType>(obj); 

if (new_typ_obj)
    new_typ_obj.do();

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

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

在您的示例中,除非NewType是指针或引用类型的typedef且obj也属于这些类型,否则编译器会在转换无效时给出错误。

执行if (new_typ_obj)对于在任何static_cast案例中检查演员是否成功没有意义。如果NewType不是这些多态类型中的一种,那么使用new_type_obj作为条件只有在您有某种方法将其转换为bool时才有效(或者 bool)。即使它确实如此,它也与演员无关。相反,如果您static_cast指向继承层次结构,那么static_cast将不会向您提供有关其是否成功的任何信息。为此,您需要dynamic_cast

答案 3 :(得分:1)

如果您要将的类型与您要投射到的类型无关

static_cast将无法编译。除了void *与所有类型相关。因此,static_cast在编译时仍然是一个很好的保证。

仍有进行错误贬低的危险。

我的个人规则是:

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

如果用于向下转换的static_cast无危险,则可以废除后一条规则。