Почему этот код работает? Я ожидал, что это провалится из-за нарушения одного из основных правил С++:
#include <iostream>
using namespace std;
struct A {
A() { cout << "ctor A" << endl; }
void doSth() { cout << "a doing sth" << endl; }
};
struct B {
B(A& a) : a(a) { cout << "ctor B" << endl; }
void doSth() { a.doSth(); }
A& a;
};
struct C {
C() : b(a) { cout << "ctor C" << endl; }
void doSth() { b.doSth(); }
B b;
A a;
};
int main()
{
C c;
c.doSth();
}
https://wandbox.org/permlink/aoJsYkbhDO6pNrg0
Я ожидал, что это сработает, поскольку в C-конструкторе B дается ссылка на объект A, если этот объект еще не создан.
Я что-то упустил? Правило порядка инициализации совпадает с порядком полей, которое не применяется для ссылок?
EDIT: Меня еще больше удивляет, что я могу добавить вызов "a.doSth();" внутри конструктора B, и это также сработает. Зачем? В этот момент объект A не должен существовать!