Ó gurus C ++, eu procuro sua sabedoria. Fale padronizado para mim e diga se C ++ garante que o seguinte programa:
#include <iostream>
using namespace std;
struct A
{
A() { cout << "A::A" << endl; }
~A() { cout << "A::~" << endl; }
};
struct B
{
B() { cout << "B::B" << endl; }
~B() { cout << "B::~" << endl; }
};
struct C
{
C() { cout << "C::C" << endl; }
~C() { cout << "C::~" << endl; }
};
struct Aggregate
{
A a;
B b;
C c;
};
int main()
{
Aggregate a;
return 0;
}
sempre produzirá
A::A
B::B
C::C
C::~
B::~
A::~
Em outras palavras, é garantido que os membros sejam inicializados pela ordem de declaração e destruídos na ordem reversa?
Respostas:
Sim para ambos. Veja 12.6.2
fonte
Sim, eles são (membros não estáticos). Veja 12.6.2 / 5 para inicialização (construção) e 12.4 / 6 para destruição.
fonte
Sim, o padrão garante que os objetos sejam destruídos na ordem inversa em que foram criados. A razão é que um objeto pode usar outro, portanto depender dele. Considerar:
Se
a
destruísse antesb
,b
haveria uma referência de membro inválida. Ao destruir os objetos na ordem inversa em que foram criados, garantimos a destruição correta.fonte
Sim e sim. A ordem de destruição é sempre oposta à ordem de construção, para variáveis de membro.
fonte