为什么Clang有时返回nullptr,有时返回我想要的
Why does Clang returns sometimes nullptr, sometimes what I want?
如果你想更广泛地了解我想做的东西,这个问题间接地跟随这个问题。
因此,基本上,我想区分捕获普通类的处理程序和捕获实际上是子类的类的处理程序。
因此,使用前面提供的链接,我找到了一种方法来知道我是在处理一个简单的类还是一个子类,但是,我无法获得与我的子类相关联的基的CXXRecordDecl
。
例如,下面是一段代码:
class B{
// Implementation of class B
};
class D : public B{
// Implementation of class D
};
int main(){
try{
// Code for try statement
}
catch(D & d){
// Handler for D
}
return 0;
}
用下面的代码,我能够得到class D
的CXXRecordDecl
:
bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
CXXRecordDecl * child_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl();
return true;
}
这工作得很好,我可以有CXXRecordDecl
通过QualType
。所以我天真地认为这将工作很好,以获得基类:
bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
CXXRecordDecl * base_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getTypePtr()->getPointeeCXXRecordDecl();
return true;
}
但是这返回nullptr。但是,如果我执行这一行:
cout << tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getAsString() << endl;
我有我想要的输出(类B)。
那么,为什么我可以在一种情况下有类声明,而不是在另一种情况下??
我终于找到了一个方法来获得我想要的CXXRecordDecl
。
我没有一个合理的解释,但是:
- 在第一种情况下,使用getPointeeCXXRecordDecl方法返回所需的
CXXRecordDecl
。 - 在第二种情况下,使用getAsCXXRecordDecl方法返回所需的
CXXRecordDecl
。
这些语句不能互换(第一种情况下使用getAsCXXRecordDecl
返回nullptr
,而第二种情况下使用getPointeeCXXRecordDecl
返回nullptr
)。
我没有解释,但它确实像我想的那样工作,即使不知道确切原因有点困扰我:/
旧帖子,但因为我偶然发现了它,我认为我应该澄清:你混淆了getPointeeCXXRecordDecl
和getAsCXXRecordDecl
。前者仅用于指针和引用类型,D & d
在catch
中定义了这些类型。但是class D
的基类(存储在您通过bases_begin()
访问的CXXBaseSpecifier
内部)不是指针或引用类型,它只是一个无聊的记录类型。所以这就是为什么你需要在一种情况下使用getAsCXXRecordDecl
而不是其他。
- 如何设置一个范围来提取我想要获得的信息
- 链接列表运算符重载没有打印出我想要的内容
- 莱克斯没有返回我想要的东西
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 我想要一个改变数组快速排序的2个数字的函数
- 输出不是我想要C++的
- 使用运算符覆盖排序没有得到我想要的
- C ++,否则文本程序不会进入我想要的途径
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 我如何使用 juce 的文件过滤器描述我想要的文件过滤器?
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 代码不会发送我想要的权衡
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我如何强迫Visual Studio使用我想要的依赖性库名称
- 我的 OpenGL QQuickItem 没有我想要的大小
- 我可以/应该在 #ifndef 后输入任何我想要的东西
- 函数不返回我想要的值
- 为什么Clang有时返回nullptr,有时返回我想要的