web-dev-qa-db-fra.com

Ordre d'évaluation de la liste d'initialisation du constructeur

J'ai un constructeur qui prend quelques arguments. J'avais supposé qu'elles avaient été construites dans l'ordre indiqué, mais dans un cas, il semble qu'elles aient été construites en sens inverse, ce qui a entraîné un avortement. Lorsque j'ai inversé les arguments, le programme a cessé d'abandonner. Ceci est un exemple de la syntaxe que j'utilise. Le fait est que a_ doit être initialisé avant b_ dans ce cas. Pouvez-vous garantir l'ordre de construction?

par exemple.

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

    OtherClass a_;
    AnotherClass b_;
};
242
Matt

Cela dépend de l'ordre de déclaration des variables membres dans la classe. Alors a_ sera le premier, puis b_ sera le deuxième dans votre exemple.

268
AraK

Pour citer la norme, pour clarification:

12.6.2.5

L'initialisation doit se dérouler dans l'ordre suivant:

...

  • Ensuite, les membres de données non statiques doivent être initialisés dans l'ordre dans lequel ils ont été déclarés dans la définition de classe (toujours indépendamment de l'ordre des mem-initializer).

...

190
GManNickG

Le référence standard apparaît à présent comme étant 12.6.2 section 13.3:

(13.3) - Ensuite, les membres de données non statiques sont initialisés dans l'ordre dans lequel ils ont été déclarés dans la définition de classe (encore une fois, quel que soit l'ordre des initialiseurs de mémoire).

14
Adam Getchell