¿Cuál es el orden de evaluación en una lista de inicializadores de miembros?

2 minutos de lectura

avatar de usuario de hookenz
gancho

Tengo un constructor que toma algunos argumentos. Supuse que se inicializaron en el orden indicado, pero en un caso, parece que se inicializaron al revés, lo que resultó en un aborto. Cuando invertí los argumentos, el programa dejó de abortar.

A continuación se muestra un ejemplo de la sintaxis que estoy usando. a_ debe inicializarse antes b_ en este caso. ¿Puede garantizar este orden de inicialización?

class A
{
  public:
    OtherClass a_;
    AnotherClass b_;

    A(OtherClass o, string x, int y)
      : a_(o)
      , b_(a_, x, y) {}
};

  • Usted dice que está preguntando acerca de los argumentos del constructor, pero se evalúan antes de que llegue al constructor, y se evalúan en un orden no especificado determinado por el compilador. Pero en realidad está preguntando sobre el orden de las listas de inicialización, así que cambié el título de la pregunta por usted.

    – Rob Kennedy

    7 de agosto de 2009 a las 12:45

  • Me hicieron esta pregunta en una entrevista 🙂

    – Sunil Kartikey

    19 de septiembre de 2020 a las 5:46

  • El entrevistador probablemente obtuvo la pregunta de aquí 🙂

    – hookenz

    19 de septiembre de 2020 a las 6:57

  • @hookenz No, no lo hicimos.

    – LandonZeKepitelOfGreytBritn

    20 de julio de 2022 a las 10:56

Avatar de usuario de Khaled Alshaya
Khaled Alshaya

Depende del orden de las declaraciones de miembros de datos en la clase. Entonces a_ será el primero, entonces b_ será el segundo en su ejemplo.

  • De hecho, los buenos compiladores le advertirán si tiene un orden diferente en la declaración versus la lista de inicializadores del constructor. Por ejemplo, ver -Wreorder en gcc.

    – Greg Hewgill

    7 de agosto de 2009 a las 4:17

  • La razón por la que se construyen en el orden de declaración de miembros y no en el orden del constructor es que uno puede tener varios constructores, pero solo hay un destructor. Y el destructor destruye los miembros en el orden inverso de construcción.

    – Un programador

    7 de agosto de 2009 a las 6:45

  • ¿Quisimos decir… orden inverso de declaración? No de “construcción”, el destructor no puede ver dentro del constructor para saber, ¿o sí?

    usuario337598

    5 de noviembre de 2018 a las 15:09

Para citar la norma, para aclaración:

12.6.2.5

La inicialización procederá en el siguiente orden:

  • Luego, los miembros de datos no estáticos se inicializarán en el orden en que fueron declarados en la definición de clase (de nuevo, independientemente del orden de los inicializadores de mem).

El Referencia estándar para esto ahora parece ser 12.6.2 sección 13.3:

(13.3) — Luego, los miembros de datos no estáticos se inicializan en el orden en que fueron declarados en la definición de clase (de nuevo, independientemente del orden de los inicializadores de mem).

¿Ha sido útil esta solución?