Да, использование вами функции-члена в списке инициализации допустимо и соответствует стандарту.
Члены данных инициализируются в порядке их объявления (и именно поэтому они должны отображаться в списке инициализации в порядке их объявления - правило, которому вы следовали в своем примере). N_
инициализируется первым, и вы могли бы передать этот элемент данных в fill_arr
. fill_arr
вызывается перед конструктором, но поскольку эта функция не обращается к неинициализированным элементам данных (она вообще не обращается к элементам данных), ее вызов считается безопасным.
Вот некоторые соответствующие исключения из последнего проекта (N3242=11-0012) стандарта C++:
§ 12.6.2.13: Функции-члены (включая виртуальные функции-члены, 10.3) могут вызываться для строящегося объекта. (...) Однако, если эти операции выполняются в ctor-initializer (или в функции, вызываемой прямо или косвенно из ctor-initializer) до завершения всех meme-initializers для базовых классов результат операции не определен. Пример:
class A { public: A(int); };
class B : public A {
int j;
public:
int f();
B() : A(f()), // undefined: calls member function
// but base A not yet initialized
j(f()) { } // well-defined: bases are all initialized
};
class C {
public:
C(int);
};
class D : public B, C {
int i;
public:
D() : C(f()), // undefined: calls member function
// but base C not yet initialized
i(f()) { } // well-defined: bases are all initialized
};
§12.7.1: Для объекта с нетривиальным конструктором обращение к любому нестатическому члену или базовому классу объекта до начала выполнения конструктора приводит к неопределенному поведению. Пример
struct W { int j; };
struct X : public virtual W { };
struct Y {
int *p;
X x;
Y() : p(&x.j) { // undefined, x is not yet constructed
}
};
person
Bojan Komazec
schedule
24.06.2012
fill_arr
какstatic
и не сомневаться в том, что это законно? - person K-ballo   schedule 24.06.2012fill_arr
, если этоstatic
, должен ли я защищать его своего рода мьютексом? - person ev-br   schedule 24.06.2012std::vector<double> arr
имеет автоматическое хранилище, поэтому для каждого вызова функцииfill_arr
будет его экземпляр. Это базовый C++... - person K-ballo   schedule 24.06.2012