繁体   English   中英

std :: bad_cast指针vs参考情况

[英]std::bad_cast pointer vs reference situation

我注意到关于std :: bad_cast异常,引用和指针似乎没有相同的行为。 例如:

class A { public: ~A() {} };
class B : public A {};

//Case #1
int main()
{
    A a;
    B& b = dynamic_cast<B&>(a);  //Would throw std::bad_cast.
}

//Case #2
int main()
{
    A* a = new A;
    B* b = dynamic_cast<B*>(a);  //Would not throw std::bad_cast.
}

在第一种情况下,生成std :: bad_cast的异常,在第二种情况下,不生成异常 - 相反,b指针只被赋值NULL。

有人可以向我解释为什么只有前者在两个都是bad_cast示例时抛出异常? 我认为这个决定背后有一个很好的动机,而且我误解了一些因为我不理解这种动机的东西。

有人可以向我解释为什么只有前者抛出异常?

这就是指定dynamic_cast行为方式:涉及指针的错误dynamic_cast产生空指针,但是没有空引用,因此涉及引用的错误dynamic_cast会抛出bad_cast

涉及指针的失败的dynamic_cast产生空指针的事实很有用,因为它允许更简洁的类型检查,并允许以下习惯用法:

if (B* b = dynamic_cast<B*>(a))
{
    // The dynamic_cast succeeded and 'b' is non-null.
}

使用这个习惯用法, b在范围内并且可用,当且仅当它是非空的时。

引用必须绑定到包含有效内存地址的对象...它们不能“未初始化”,也不能具有默认的非绑定初始化值。 请注意,C ++ 11标准中的第8.5 / 8节说明,

调用引用类型实体的默认初始化或值初始化的程序是不正确的。

另一方面,指针变量只是包含指向其他内存地址的值的内存地址,因此可以具有NULL值。

因此,如果按照标准, dynamic_cast<T&>操作必须返回一个有效的内存地址来绑定到引用变量,那么如果动态转换失败,它就不能返回“非值”...唯一的选择是抛出一个例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM