Как уже ответили, списки инициализации полностью выполняются до входа в блок конструктора. Таким образом, полностью безопасно использовать (инициализированные) члены в теле конструктора.
Вы сделали комментарий в принятом ответе о необходимости ссылаться на аргументы конструктора, но не на член vars внутри блока конструктора. Вы не.
Возможно, вы ошиблись тем, что должен ссылаться на параметры, а не на атрибуты внутри списка инициализации. В качестве примера, для класса X, который имеет два члена (a_ и b_) типа int, следующий конструктор может быть неправильно определен:
X::X( int a ) : a_( a ), b( a_*2 ) {}
Возможная проблема здесь заключается в том, что построение элементов в списке инициализации зависит от порядка объявления в классе, а не от порядка, в котором вы вводите список инициализации. Если класс был определен как:
class X
{
public:
X( int a );
private:
int b_;
int a_;
};
Тогда, независимо от того, как вы вводите список инициализации, факт заключается в том, что b_ (a_ * 2) будет выполнено до инициализации a_, так как объявление членов сначала b_, а затем a_ , Это создаст ошибку, поскольку ваш код считает (и, вероятно, зависит), что b_ в два раза больше значения a_, и фактически b_ содержит мусор. Самое простое решение не ссылаться на членов:
X::X( int a ) : a_( a ), b( a*2 ) {} // correct regardless of how X is declared
Избежание этой ловушки является причиной, по которой вам предлагается не использовать атрибуты элемента как часть инициализации других элементов.