typeid 運算子

語法

typeid(type-id)
typeid(expression)

備註

typeid 運算子允許在執行階段判斷物件的類型。

typeid 的結果是 const type_info&。 該值是 type_info 物件的參考,並根據使用的 typeid 形式表示 type-idexpression 的類型。 如需詳細資訊,請參閱 type_info 類別

typeid 運算子不適用於受控類型 (抽象宣告子或執行個體)。 如需取得指定類型的 Type 的詳細資訊,請參閱 typeid

typeid 運算子套用至多型類別類型的左值時,會在物件真正的類型無法透過提供的靜態資訊判斷的情況下進行執行階段檢查。 這類案例包括:

  • 類別的參考

  • 已透過 * 取值的指標

  • 註標的指標 ([ ])。 (使用具有多型類型指標的註標並不安全。)

如果 expression 指向基底類別類型,但是物件的類型實際上是衍生自該基底類別,則結果會是衍生類別的 type_info 參考。 expression 必須指向多型類型 (具有虛擬函式的類別)。 否則,結果會是 expression 中所參考靜態類別的 type_info。 此外,指標必須已取值,使用的物件才會是其指向的物件。 若沒有為指標取值,則結果會是指標的 type_info,而不是它所指向的目標。 例如:

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main() {
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}

如果 expression 會為指標取值,而且該指標的值為零,則 typeid 會擲回 bad_typeid 例外狀況。 如果指標未指向有效的物件,則會擲回 __non_rtti_object 例外狀況。 其表示嘗試分析觸發錯誤的 RTTI,因為物件在某種程度上無效。 (例如,這是不良的指標,或未使用 /GR 編譯程式碼)。

如果 expression 不是指標,也不是物件的基底類別參考,則結果會是 type_info 參考,表示 expression 的靜態類型。 運算式的「靜態類型」是指運算式的類型,也就是在編譯時期所知的類型。 評估運算式的靜態類型時,會忽略執行語意。 此外,在判斷運算式的靜態類型時,會盡可能忽略參考:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid 也可以在樣板中用來判斷樣板參數的類型:

// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}

另請參閱

執行階段類型資訊
關鍵字