struct A{};
struct B : A{};
int main()
{
A a;
A& a_ref = a;
static_cast<B>(a); // *1
static_cast<B&>(a_ref); // *2
return 0;
}
(*1)会产生一个错误,我了解原因。(*2)能够编译通过,但是为什么呢?假设B
包含一些属性,如果我将a_ref
强制转换为B&
然后尝试访问这些属性会怎样呢?我想我会遇到运行时错误或者其他问题。
所以,我发现存在这样一种情况可能导致程序崩溃,而且没有办法可以避免,不像使用dynamic_cast
,我们可以检查转换结果是否为空或者在try-catch
区域放入代码。那么当我需要进行引用类型的强制转换并确保得到正确的引用时,我该如何应对这种情况呢?
static_cast
将 lvalue 下转型为派生类的引用,因为没有隐式转换方式(与从派生类到基类的转换相反)。只有在事先知道它是安全的情况下(即您要转换的 lvalue 是派生类型或派生类型的情况),才应仅用于此目的。 - dyp*2
行似乎没问题,因为在某些情况下将A&
强制转换为B&
是有效的。编译器必须进行更复杂的分析才能确定在这种情况下它实际上是无效的。这可能要么太困难,要么太慢而不切实际。 - Vaughn Cato