c ++ static_cast和引用

fog*_*bit 11 c++ static-cast

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;
}
Run Code Online (Sandbox Code Playgroud)

(*1)产生错误,我理解为什么.(*2)编译好,但为什么?并且,只要它编译并假设B包含一些属性,如果我a_ref转换B&然后尝试访问属性怎么办?我想我会遇到运行时错误.

所以,正如我所看到的,有一种情况会导致崩溃并且没有办法避免崩溃,这与dynamic_cast人们可以检查转换为null的结果或将代码放在某个try-catch区域中的情况不同.我如何处理这种情况,我需要投射参考,并确保我真正得到正确的参考.

For*_*veR 8

从标准的n3337草案5.2.9/2

类型为"cv1 B"的左值,其中B是类类型,可以强制转换为类型"引用cv2 D",其中D是从B派生的类(第10条),如果是从"指针到"的有效标准转换D"到"指向B的指针"存在(4.10),cv2与cv1相同,或者cv资格比cv1更高,并且B既不是D的虚基类,也不是虚基类的基类D.

在你的情况下:

B是派生自的类A,都是非const,并且允许从A*to 转换B*,A不是虚拟基类D.


Joh*_*hny 6

boost::polymorphic_downcast这是我使用(doc )的原因之一- 在调试中它使用dynamic_cast后跟断言,而在发布中它是static_cast,所以不会影响性能。


Rax*_*van 5

static_cast<> 只会检查类型是否兼容

如果 1 类型不直接兼容,因为没有运算符来描述A 和 B 之间的复制关系

在第 2 种情况下,强制转换是引用强制转换,就编译器而言,A*可以强制转换为,B*因为它们是兼容的。编译器不知道指针a_ref保存什么,这就是它允许您使用它的原因。dynamic_cast<>检查指针指向的类。