【发布时间】:2013-10-30 13:03:12
【问题描述】:
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 中,人们可以检查转换为 null 的结果或将代码放入 try-catch地区。我该如何处理这种需要投射参考并确保我真的得到正确参考的情况。
【问题讨论】:
-
你必须知道你在用
static_cast做什么,错误使用的静态转换结果没有运行时异常。 -
您可以使用
static_cast将左值向下转换为派生类的引用,因为这种方式没有隐式转换(与从派生类转换为基类相反)。 如果你事先知道它是安全的(即你要转换的左值是派生类型或派生的),你应该只将它用于那个目的。 -
可能XY Problem。为什么需要对派生类型的引用?
-
@JohnDibling:我需要它来将 A& 转换为 B& 并使用属性。
-
编译器只会发现某些类型的问题。单独使用
*2行似乎很好,因为在某些情况下将A&转换为B&是有效的。编译器必须进行更复杂的分析才能确定在这种情况下它实际上是无效的。这可能太难或太慢而无法实现。
标签: c++ static-cast