static_cast
不会抛出异常。但如果它不成功,它将产生一个未定义的结果。检查演员表是否成功的最正确方法是什么?
这会有帮助吗?
NewType new_typ_obj = static_cast<NewType>(obj);
if (new_typ_obj)
new_typ_obj.do();
static_cast
不会抛出异常。但如果它不成功,它将产生一个未定义的结果。检查演员表是否成功的最正确方法是什么?
这会有帮助吗?
NewType new_typ_obj = static_cast<NewType>(obj);
if (new_typ_obj)
new_typ_obj.do();
static_cast不会为您提供有关成功的信息。如果您需要进行动态类型转换,请使用 dynamic_cast 或 boost any 之类的库。
在您给出的示例中,这static_cast
可能会根据所涉及的类型引发异常,例如,如果NewType
throws 的构造函数。如果不存在从 to 类型的任何转换链obj
,NewType
那么它甚至不会编译。
您可能正在考虑使用static_cast
将指向基址的指针转换为指向派生的指针,这是dynamic_cast
检查的情况。没有办法判断static_cast
在这种情况下是否成功。作为程序员,您有责任仅在正确的情况下使用它。
static_cast
仅当您在指针、引用或指向成员类型的指针之间进行强制转换时,A才具有未定义的行为。当您对不是真正指向的对象类型的类型执行向下转换时,就会发生这种情况。
在您的示例中,除非NewType
是指针或引用类型的 typedef 并且obj
也是这些类型,如果强制转换无效,编译器会给您一个错误。
在任何情况下,表演if (new_typ_obj)
对于检查演员表是否成功都是没有意义的static_cast
。如果NewType
不是这些多态类型之一,那么仅当您有某种方式将其转换为(或它是)时,new_type_obj
用作条件才有效。即便如此,也与演员无关。相反,如果您通过指向继承层次结构的指针进行 ing,则不会向您提供有关它是否成功的任何信息。为此,您想要.bool
bool
static_cast
static_cast
dynamic_cast
static_cast
如果您要转换的类型与您要转换的类型无关,则不会编译。除了与void *
所有类型有关。因此 static_cast 在编译时仍然是一个很大的保证。
仍然存在做错事的危险。
我个人的规则是:
如果 downcast 的 static_cast 没有危险,则可以取消后一条规则。