提问人:Hardik 提问时间:8/23/2023 更新时间:8/23/2023 访问量:51
std::typeid() 在取消引用 NULL 指针时不会抛出bad_typeid异常
std::typeid() donot throw bad_typeid exception while derefencing the NULL pointer
问:
仅对类 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异常吗?
答:
3赞
Jerry Coffin
8/23/2023
#1
[expr.typeid]/3:
当应用于多态类类型的 glvalue 以外的表达式时,结果将引用表示表达式静态类型的对象。左值到右值、数组到指针和函数到指针的转换不应用于表达式。如果表达式是 prvalue,则应用临时具体化转换。表达式是未计算的操作数。
typeid
std::type_info
[强调后加]
因此,当操作数为 a 时,typeid 仅取决于它是 ,并且不计算表达式(取消引用的 null 指针)。char *
char *
由于是(潜在)多态类类型的 glvalue,因此计算其操作数。*ptrvar
在这种情况下,编译器可以应用优化:由于没有编译派生的类,它可以推断出只能指向类型的对象,而不是派生自的任何对象 - 但是虽然在这种情况下这很容易,但在其他情况下它可能是非平凡的(或不可能的),所以它不是必需的。Test
ptrvar
Test
Test
评论
char* cptr
*cptr
char
Test* ptrvar
*ptrvar
nullptr
typeid
是关键字,而不是命名空间的成员。 是语法错误。std
std::typeid