[英]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.