О гуру C ++, я ищу твоей мудрости. Говорите со мной на стандартном языке и скажите, гарантирует ли C ++, что следующая программа:
#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;
}
всегда будет производить
A::A
B::B
C::C
C::~
B::~
A::~
Другими словами, гарантируется ли инициализация членов в порядке объявления и уничтожение в обратном порядке?
Ответы:
Да обоим. См. 12.6.2
источник
Да, они есть (то есть нестатические члены). См. 12.6.2 / 5 для инициализации (построения) и 12.4 / 6 для разрушения.
источник
Да, стандарт гарантирует, что объекты будут уничтожены в порядке, обратном их созданию. Причина в том, что один объект может использовать другой и зависеть от него. Рассматривать:
Если бы он
a
был уничтожен раньше,b
тоb
содержал бы недопустимую ссылку на член. Уничтожая объекты в порядке, обратном их созданию, мы гарантируем правильное разрушение.источник
Да и да. Порядок уничтожения всегда противоположен порядку построения для переменных-членов.
источник