initialize enclosed brace c++ constructor initialization order-of-evaluation ctor-initializer

enclosed - initialize vector c++ 11



Lista de inicializadores*argumento*orden de evaluaciĆ³n (1)

Entonces, el estándar de C ++ requiere que los miembros de la clase se inicialicen en el orden en que se declaran en la clase, en lugar del orden en que se mencionan en la lista de inicializadores de cualquier constructor. Sin embargo, esto no implica nada sobre el orden en que se evalúan los argumentos a esas inicializaciones. Estoy trabajando con un sistema que con frecuencia pasa referencias a objetos de serialización y me pregunto si puedo asegurar que los bits se lean en el orden correcto, independientemente del orden en que esos bits se escriben en los campos del objeto.

struct Foo { int a; double b; // I want to be able to do this Foo(SerObj &s) : b(s.readDouble()), a(s.readInt()) { } // Rather than this Foo (SerObj &s) { b = s.readDouble(); a = s.readInt(); } };

Obviamente, reordenar cosas como ints y ints en la declaración no es un gran problema, pero a veces pueden ser objetos más grandes y cosas que requieren una asignación dinámica.


Norma C ++ 12.6.2/3 :

Hay un punto de secuencia (1.9) después de la inicialización de cada base y miembro. La lista de expresiones de un mem-initializer se evalúa como parte de la inicialización de la base o miembro correspondiente.

El orden de la inicialización es el que especificó en la pregunta. La evaluación es parte de esta inicialización, y las inicializaciones no pueden intercalarse (porque hay un punto de secuencia entre ellas).

Eso significa que las llamadas de función en sus listas de inicializadores no se invocan en el orden deseado, sino en el orden en que aparecen las declaraciones de los miembros.