名稱空間
變體
操作

std::bad_cast

來自 cppreference.com
< cpp‎ | 型別
 
 
 
型別支援
基本型別
定寬整數型別 (C++11)
定寬浮點型別 (C++23)
(C++11)    
(C++17)
數值極限
C 數值極限介面
執行時型別資訊
bad_cast
 
定義於標頭檔案 <typeinfo>
class bad_cast : public std::exception;

當對引用型別進行 dynamic_cast 失敗執行時檢查(例如,因為型別沒有繼承關係)時,以及當請求的 facet 不存在於 locale 中時,std::use_facet 會丟擲此型別的異常。

cpp/error/exceptionstd-bad cast-inheritance.svg

繼承圖

目錄

[編輯] 成員函式

(建構函式)
構造一個新的 bad_cast 物件
(公開成員函式)
operator=
替換 bad_cast 物件
(公開成員函式)
what
返回解釋字串
(公開成員函式)

std::bad_cast::bad_cast

(1)
bad_cast() throw();
(C++11 前)
bad_cast() noexcept;
(C++11 起)
(2)
bad_cast( const bad_cast& other ) throw();
(C++11 前)
bad_cast( const bad_cast& other ) noexcept;
(C++11 起)

構造一個新的 bad_cast 物件,帶有一個實現定義的以 null 結尾的位元組字串,該字串可透過 what() 訪問。

1) 預設建構函式。
2) 複製建構函式。如果 *thisother 都具有動態型別 std::bad_cast,則 std::strcmp(what(), other.what()) == 0(C++11 起)

引數

其他 - 要複製的另一個異常物件

std::bad_cast::operator=

bad_cast& operator=( const bad_cast& other ) throw();
(C++11 前)
bad_cast& operator=( const bad_cast& other ) noexcept;
(C++11 起)

將內容賦為 other 的內容。 如果 *thisother 都具有動態型別 std::bad_cast,則賦值後 std::strcmp(what(), other.what()) == 0(C++11 起)

引數

其他 - 用於賦值的另一個異常物件

返回值

*this

std::bad_cast::what

virtual const char* what() const throw();
(C++11 前)
virtual const char* what() const noexcept;
(C++11 起)
(C++26 起為 constexpr)

返回解釋字串。

返回值

指向實現定義的、以 null 結尾的字串的指標,包含解釋資訊。該字串適合轉換為 std::wstring 並顯示。該指標保證在獲取它的異常物件被銷燬之前,或在該異常物件上呼叫非常量成員函式(例如複製賦值運算子)之前有效。

在常量求值期間,返回的字串使用普通字面量編碼進行編碼。

(C++26 起)

注意

允許但不要求實現重寫 what()

繼承自 std::exception

成員函式

銷燬異常物件
(std::exception 的虛公共成員函式) [編輯]
[虛擬]
返回解釋字串
(std::exception 的虛公共成員函式) [編輯]

[編輯] 註解

特性測試 標準 特性
__cpp_lib_constexpr_exceptions 202411L (C++26) 異常型別的 constexpr

[編輯] 示例

#include <iostream>
#include <typeinfo>
 
struct Foo { virtual ~Foo() {} };
struct Bar { virtual ~Bar() { std::cout << "~Bar\n"; } };
struct Pub : Bar { ~Pub() override { std::cout << "~Pub\n"; } };
 
int main()
{
    Pub pub;
    try
    {
        [[maybe_unused]]
        Bar& r1 = dynamic_cast<Bar&>(pub); // OK, upcast
 
        [[maybe_unused]]
        Foo& r2 = dynamic_cast<Foo&>(pub); // throws
    }
    catch (const std::bad_cast& e)
    {
        std::cout << "e.what(): " << e.what() << '\n';
    }
}

可能的輸出

e.what(): std::bad_cast
~Pub
~Bar