Sí, su uso de la función de miembro en la lista de inicialización es válido y cumple con la norma.
Los miembros de datos se inicializan en el orden de su declaración (y esa es la razón por la que deberían aparecer en la lista de inicialización en el orden de su declaración, la regla que siguió en su ejemplo). N_
se inicializa primero y puede haber pasado este miembro de datos al fill_arr
. fill_arr
se llama antes del constructor pero debido a que esta función no accede a los miembros de datos no inicializados (no tiene acceso a los miembros de datos) su llamada se considera segura.
Éstos son algunos exceptúa relevantes desde el último borrador (N3242 = 11-0012) del C++ estándar:
§ 12.6.2.13: funciones miembros (incluyendo las funciones miembro virtuales, 10.3) se pueden llamar para un objeto en construcción. (...) Sin embargo, si estas operaciones se realizan en un inicializador de ctor (o en una función llamada directa o indirectamente desde un ctor-inicializador) antes de que todos los mem-initializers para clases base tengan completado, el resultado de la operación no está definido. Ejemplo:
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: Para un objeto con un constructor no trivial, en referencia a cualquier miembro o base de clase no estática del objeto antes de la constructor comienza resultados de la ejecución en comportamiento indefinido Ejemplo
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
}
};
La pregunta es buena, pero el ejemplo de código es un poco artificial. ¿Qué le impide declarar 'fill_arr' como' estático' y no tiene dudas de que es legal? –
¿Sería eso seguro para subprocesos? Quiero decir, hay un vector local para 'fill_arr', si eso es' static', ¿debo protegerlo con una especie de mutex? –
El 'std :: vector arr' tiene _automatic storage_, por lo que habría una instancia para cada invocación de la función' fill_arr'. Eso es básico _C++ _... –