如何在 clang 的 AST 中找到隐式删除的默认构造函数?

Pet*_*ter 7 c++ clang abstract-syntax-tree libtooling

考虑以下结构体定义foo.cc

struct Foo
{
  int &bar;
};
Run Code Online (Sandbox Code Playgroud)

因为bar具有引用类型,所以隐式普通默认构造函数Foo::Foo()被隐式删除。然而,这个事实似乎并没有反映在 clang 生成的 AST 中。例如,运行clang -Xclang -ast-dump foo.cc结果为:

struct Foo
{
  int &bar;
};
Run Code Online (Sandbox Code Playgroud)

所以这里看起来像存在一个隐式的普通默认构造函数,但没有提到它被删除。同样,clang::CXXRecordDeclAPI 似乎也没有提供确定这一点的方法。但此时(语义分析之后)该信息不应该可用吗?如何使用 clang AST API 来查明某个类的隐式普通默认构造函数是否被隐式删除?

小智 0

隐式构造函数不存在于CXXRecordDecl节点下的 AST 中,而仅存在于DefinitionData.

您可以Sema::ForceDeclarationOfImplicitMembers在 AST 插件中使用来获取构造函数,然后检查是否被删除。

// force declaration of implict constructors
clang::Sema &sema = Instance.getSema();
sema.ForceDeclarationOfImplicitMembers(const_cast<CXXRecordDecl*>(cxxRecordDecl));

// then check whether constructor is deleted
for (const auto* ctor : cxxRecordDecl->ctors()) {
    if (ctor->isDeleted() {
       // do something
    }
}
Run Code Online (Sandbox Code Playgroud)