何时调用__cxa_deleted_virtual

Kla*_*aus 6 c++ libstdc++

我尝试为avr c ++构建构建一个小测试用例集.

通常从c ++库提供一些"特殊功能".现在我想写一个测试程序,它产生这个必须链接的错误代码__cxa_deleted_virtual.

任何人都可以提供一个代码片段,导致链接到该功能?

我实际上不知道如何制作这个"错误"代码.

T.C*_*.C. 4

它用于填充已定义为已删除的虚拟函数的 vtable 槽:

struct B { virtual void f() = delete; };
struct D : B { virtual void f() = delete; };
Run Code Online (Sandbox Code Playgroud)

(已删除的虚拟函数包含在 vtable 中的原因是,这允许以后将其更改为非删除,而不会破坏 vtable 布局。)

我不知道它实际上可以在(相对健全的)C++中调用,因为唯一可以重写具有删除定义的函数的是另一个具有删除定义的函数([class.virtual]/16),任何尝试调用具有已删除定义的函数都会导致程序格式错误。我想你可以援引 ODR 违规的幽灵:

// TU 1
struct B { virtual void f() = delete; virtual void g(); };
void B::g() { } // causes vtable to be emitted in this TU

// TU 2
struct B { virtual void f(); virtual void g(); };

void h(B* b) { b->f(); }

int main() {
    B b;
    h(&b);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用过时的标头来声明函数未被删除的调用代码怎么样?如果该类是由独立于使用“B”的代码构建的库提供的,则这种情况尤其容易发生。 (2认同)