Я понимаю, что для нестатических переменных-членов порядок вычисления в списке инициализатора соответствует порядку объявления в классе.
Рассмотрим пример ниже из isocpp
#include <iostream>
class Y {
public:
Y();
void f();
};
Y::Y() { std::cout << "Initializing Y\n"<<this<<"\n"; }
void Y::f() { std::cout << "Using Y\n"<<this<<"\n"; }
class X {
public:
X(Y& y);
};
X::X(Y& y) { y.f(); }
class Z {
public:
Z() throw();
protected:
X x_;
Y y_;
};
Z::Z() throw() : y_(), x_(y_) {}
int main()
{
Z z;
return 0;
}
Поскольку ctor X требует ссылки Y, мы в идеале должны сначала инициализировать y_;это означает, что y_ должен быть объявлен до x _.
Я ожидал, что вышеупомянутая программа выдаст ошибку seg, но ниже мой o / p.Может кто-нибудь пролить свет на это.
-bash-4.1$ ./a.out
Using Y
0x7fffffffe0c1
Initializing Y
0x7fffffffe0c1