static_cast
不会抛出异常。但是如果它没有成功,它将产生一个未定义的结果。检查演员阵容是否成功的最恰当方法是什么?
这会有帮助吗?
NewType new_typ_obj = static_cast<NewType>(obj);
if (new_typ_obj)
new_typ_obj.do();
答案 0 :(得分:10)
static_cast不会向您提供有关成功的信息。如果你需要进行动态类型转换,请使用dynamic_cast或类似boost的库。
答案 1 :(得分:7)
在您给出的示例中,static_cast
可能根据所涉及的类型抛出异常,例如,如果NewType
的构造函数抛出。如果从obj
到NewType
的类型不存在任何转换链,则它甚至不会编译。
您可能正在考虑使用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无危险,则可以废除后一条规则。