Oh gurús de C++, busco tu sabiduría. Hablar standardese a mí y decir a mis garantías si C++ que el siguiente programa:Orden del miembro constructor y llamadas al destructor
#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;
}
producirá siempre
A::A
B::B
C::C
C::~
B::~
A::~
En otras palabras, son miembros garantizados para ser inicializado por orden de declaración y destruido a la inversa ¿orden?
Esta es una causa razonablemente común de errores sutiles cuando las clases han crecido grandes y poco consolidadas. Cuando tiene 50 miembros de datos, y muchos de ellos se inicializan en la lista de intializadores del constructor, puede ser fácil suponer que el orden de construcción es el orden en la lista de inicializadores. Después de todo, los escritores de códigos han ordenado la lista con cuidado ... ¿verdad? – Permaquid