仅针对类 NULL 指针引发异常。
#include <typeinfo>
#include <iostream>
using namespace std;
class Test
{
public:
Test(){}
virtual ~Test(){}
};
int main()
{
Test *ptrvar = nullptr;
char* cptr = nullptr;
try
{
cout << typeid(*cptr).name() << endl;
cout << typeid(*ptrvar).name() << endl;
}
catch (bad_typeid)
{
cout << "The object is null" << endl;
}
return 0;
}
输出:
c
The object is null
有人可以向我解释为什么 typeid() 不会引发 bad_typeid 异常来取消引用 char NULL 指针吗?
[expr.typeid]/3:
当
应用于多态类类型的泛左值以外的表达式时,结果引用表示表达式静态类型的typeid
对象。左值到右值、数组到指针和函数到指针的转换不适用于表达式。如果表达式是纯右值,则应用临时具体化转换。 表达式是未计算的操作数。std::type_info
[强调]
因此,当操作数是
char *
时,typeid 仅取决于它是 char *
,并且不计算表达式(取消引用的空指针)。
由于
*ptrvar
是(可能)多态类类型的泛左值,因此对其操作数进行求值。
在这种情况下,编译器可以应用优化:由于没有编译从
Test
派生的类,因此可以推断 ptrvar
只能指向 Test
类型的对象,而不是从 Test
派生的任何对象--但是虽然在这种情况下这很容易,但在其他情况下可能并不简单(或不可能),所以它不是必需的。