Порядок оценки инициализации списка конструктора

У меня есть конструктор, который принимает некоторые аргументы. Я предположил, что они были построены в указанном порядке, но в одном случае кажется, что они были построены в обратном порядке, что привело к прерыванию. Когда я отменил аргументы, программа прекратила прерывание. Это пример синтаксиса, который я использую. Дело в том, что a_ должно быть инициализировано до b_ в этом случае. Можете ли вы гарантировать порядок строительства?

например.

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

    OtherClass a_;
    AnotherClass b_;
};

Ответ 1

Это зависит от порядка объявления переменной-члена в классе. Итак, a_ будет первым, тогда b_ будет вторым в вашем примере.

Ответ 2

Чтобы процитировать стандарт, для уточнения:

12.6.2.5

Инициализация должна выполняться в следующем порядке:

...

  • Затем нестатические члены данных должны быть инициализированы в том порядке, в котором они были объявлены в определении класса (опять же независимо от порядка mem-инициализаторов).

...

Ответ 3

стандартная ссылка для этого теперь выглядит как 12.6.2, раздел 13.3:

(13.3). Затем нестатические элементы данных инициализируются в том порядке, в котором они были объявлены в определении класса (опять же независимо от порядка mem-инициализаторов).