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

问题描述 投票:0回答:1

仅针对类 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 指针吗?

c++ exception try-catch
1个回答
0
投票

[expr.typeid]/3:

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

[强调]

因此,当操作数是

char *
时,typeid 仅取决于它是
char *
,并且不计算表达式(取消引用的空指针)。

由于

*ptrvar
是(可能)多态类类型的泛左值,因此对其操作数进行求值。

在这种情况下,编译器可以应用优化:由于没有编译从

Test
派生的类,因此可以推断
ptrvar
只能指向
Test
类型的对象,而不是从
Test
派生的任何对象--但是虽然在这种情况下这很容易,但在其他情况下可能并不简单(或不可能),所以它不是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.