Oh gurús de C ++, busco tu sabiduría. Háblame estándar y dime si C ++ garantiza que el siguiente 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;
}
siempre producirá
A::A
B::B
C::C
C::~
B::~
A::~
En otras palabras, ¿se garantiza que los miembros se inicialicen por orden de declaración y se destruyan en orden inverso?
Respuestas:
Sí a ambos. Ver 12.6.2
fuente
Sí, lo son (miembros no estáticos, es decir). Consulte 12.6.2 / 5 para la inicialización (construcción) y 12.4 / 6 para la destrucción.
fuente
Sí, el estándar garantiza que los objetos se destruyan en el orden inverso al que fueron creados. La razón es que un objeto puede usar a otro, por lo tanto depender de él. Considerar:
Si
a
se destruyera antes,b
entoncesb
tendría una referencia de miembro no válida. Al destruir los objetos en el orden inverso al que fueron creados, garantizamos una destrucción correcta.fuente
Si y si. El orden de destrucción es siempre opuesto al orden de construcción, para las variables de miembro.
fuente