Какие из классов B1, B2, B3 определены неправильно?
#include <iostream> struct A{ int val; A(int v): val(v){} }; struct B1{ A a1,a2; B1(): a1(4), a2(a1.val){} }; struct B2{ A a1,a2; B2(): a2(a1.val), a1(4){} }; struct B3{ A a2,a1; B3(): a1(4), a2(a1.val){} }; main(){ B1 b1; B2 b2; B3 b3; std::cerr << b1.a2.val << "\n" << b2.a2.val << "\n" << b3.a2.val << "\n"; }
забавно, что такими играми можно случайно получить доступ к объекту до выполнения его конструктора, а компилятор (gcc-4.4.3) ничего не заметит...
realtim: такой порядок инициализации членов объясняется тем, что конструкторов может быть несколько и у них будет разный порядок инициализаторов членов; а так как общий принцип -- разрушать всё в обратном порядке, то инициализация происходит в порядке описания. Странно, что при этом можно в списке инициализаторов использовать члены класса для вычисления значений.