簡體   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