Ordem de avaliação da lista de boot do construtor

Eu tenho um construtor que leva alguns argumentos. Eu tinha assumido que eles foram construídos na ordem listada, mas em um caso parece que eles estavam sendo construídos em sentido inverso, resultando em um aborto. Quando inverti os argumentos, o programa parou de ser abortado. Este é um exemplo da syntax que estou usando. A coisa é, a_ precisa ser inicializado antes de b_ neste caso. Você pode garantir a ordem de construção?

por exemplo

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

Depende da ordem da declaração de variável de membro na class. Então a_ será a primeira, então b_ será a segunda no seu exemplo.

Para citar a norma, para esclarecimento:

12.6.2.5

A boot deve prosseguir na seguinte ordem:

  • Em seguida, os membros de dados não estáticos devem ser inicializados na ordem em que foram declarados na definição de class (novamente, independentemente da ordem dos inicializadores de memory).

A referência padrão para isso agora parece ser 12.6.2 seção 13.3:

(13.3) – Então, os membros de dados não estáticos são inicializados na ordem em que foram declarados na definição de class (novamente, independentemente da ordem dos inicializadores de mem).