下面的代码重现了我遇到的问题,MSVC 2022:
#include <iostream>
struct A {
static void message()
{
std::cout << "A::message()\n";
}
struct B {
B() {}
~B()
{
A::message();
}
};
static inline B b;
};
int main()
{
}
通过上面的代码,我看到如预期的那样出现了消息。然而:
- 如果我删除 constructor
B()
,那么析构函数~B()
似乎被删除,因为消息消失了。 - 如果我随后
int dummy;
向结构添加一个虚拟属性B
,则该消息会再次出现。
我确实找不到答案的问题:
- 在我看来,如果没有构造函数
B()
,也没有属性B
,编译器只是将类标记B
为空,然后完全跳过它。它是否正确? - 是否有记录表明这种情况可能发生?鉴于析构函数的内容,我认为这永远不会发生。
- 我怎样才能保证它始终正常工作,而不仅仅是我现在使用的编译器。定义构造函数是否
B()
足够,或者我还应该使用B
虚拟属性使其非空int dummy;
?