Och, guru C ++, szukam twojej mądrości. Powiedz mi standardowym i powiedz mi, czy C ++ gwarantuje, że następujący program:
#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;
}
zawsze będzie produkować
A::A
B::B
C::C
C::~
B::~
A::~
Innymi słowy, czy gwarantuje się, że członkowie zostaną zainicjowani zgodnie z kolejnością deklaracji i zniszczeni w odwrotnej kolejności?
Odpowiedzi:
Tak dla obu. Patrz 12.6.2
źródło
Tak, są (to znaczy niestatyczni członkowie). Patrz 12.6.2 / 5 dla inicjalizacji (konstrukcja) i 12.4 / 6 dla zniszczenia.
źródło
Tak, standard gwarantuje, że obiekty zostaną zniszczone w odwrotnej kolejności, w jakiej zostały utworzone. Powodem jest to, że jeden przedmiot może używać innego, a zatem polegać na nim. Rozważać:
Jeśli
a
miały zniszczeniu zanimb
potemb
będzie posiadać nieprawidłowy członkowskie odniesienia. Niszcząc obiekty w odwrotnej kolejności, w jakiej powstały, gwarantujemy prawidłowe zniszczenie.źródło
Tak i tak. Kolejność niszczenia jest zawsze odwrotna do kolejności konstrukcji dla zmiennych składowych.
źródło