Oh gourous du C ++, je recherche ta sagesse. Parlez-moi standard et dites-moi si C ++ garantit que le programme suivant:
#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;
}
produira toujours
A::A
B::B
C::C
C::~
B::~
A::~
En d'autres termes, les membres sont-ils garantis d'être initialisés par ordre de déclaration et détruits dans l'ordre inverse?
Réponses:
Oui aux deux. Voir 12.6.2
la source
Oui, ils le sont (c'est-à-dire des membres non statiques). Voir 12.6.2 / 5 pour l'initialisation (construction) et 12.4 / 6 pour la destruction.
la source
Oui, la norme garantit que les objets sont détruits dans l'ordre inverse de leur création. La raison en est qu'un objet peut en utiliser un autre, donc en dépendre. Considérer:
S'il
a
devait détruire avant,b
ilb
contiendrait une référence de membre non valide. En détruisant les objets dans l'ordre inverse dans lequel ils ont été créés, nous garantissons une destruction correcte.la source
Oui et oui. L'ordre de destruction est toujours opposé à l'ordre de construction, pour les variables membres.
la source