O código abaixo reproduz o problema que tenho, 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()
{
}
Com o código acima vejo, como esperado, a mensagem aparecendo. No entanto:
- Se eu remover o construtor
B()
, o destruidor~B()
parece ter sido eliminado porque a mensagem desaparece. - Se eu adicionar uma propriedade fictícia
int dummy;
à estruturaB
, a mensagem aparecerá novamente.
Perguntas para as quais realmente não consegui encontrar resposta:
- Parece-me que sem o construtor
B()
e sem propriedadesB
, o compilador simplesmente rotula a classeB
como vazia e simplesmente a ignora completamente. Isso está correto? - Está em algum lugar documentado que isso pode ocorrer? Dado o conteúdo do destruidor, acho que isso nunca deveria acontecer.
- Como posso garantir que sempre funcionará corretamente, não apenas para o compilador que estou usando no momento. Definir o construtor é
B()
suficiente ou devo também tornarB
não vazio com a propriedade fictíciaint dummy;
?