std::typeid() 在取消引用 NULL 指针时不会抛出bad_typeid异常

std::typeid() donot throw bad_typeid exception while derefencing the NULL pointer

提问人:Hardik 提问时间:8/23/2023 更新时间:8/23/2023 访问量:51

问:

仅对类 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() 不会引发取消引用 char NULL 指针的bad_typeid异常吗?

C++ 异常 try-catch

评论

0赞 273K 8/23/2023
你错过了乞求,其中需要表达式标识多态类型的对象...... 不指向多态类型,标识 . 指向一个多态类型,操作员不知道的实际类型来自(可能是某个子类型)因此引发异常。char* cptr*cptrcharTest* ptrvar*ptrvarnullptr
0赞 Red.Wave 8/23/2023
typeid是关键字,而不是命名空间的成员。 是语法错误。stdstd::typeid

答:

3赞 Jerry Coffin 8/23/2023 #1

[expr.typeid]/3:

当应用于多态类类型的 glvalue 以外的表达式时,结果将引用表示表达式静态类型的对象。左值到右值、数组到指针和函数到指针的转换不应用于表达式。如果表达式是 prvalue,则应用临时具体化转换。表达式是未计算的操作数。typeidstd​::​type_­info

[强调后加]

因此,当操作数为 a 时,typeid 仅取决于它是 ,并且不计算表达式(取消引用的 null 指针)。char *char *

由于是(潜在)多态类类型的 glvalue,因此计算其操作数。*ptrvar

在这种情况下,编译器可以应用优化:由于没有编译派生的类,它可以推断出只能指向类型的对象,而不是派生自的任何对象 - 但是虽然在这种情况下这很容易,但在其他情况下它可能是非平凡的(或不可能的),所以它不是必需的。TestptrvarTestTest