Порядок оценки списка инициализации конструктора - PullRequest
240 голосов
/ 07 августа 2009

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

, например

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

    OtherClass a_;
    AnotherClass b_;
};

Ответы [ 3 ]

260 голосов
/ 07 августа 2009

Зависит от порядка объявления переменных-членов в классе. Таким образом, a_ будет первым, затем b_ будет вторым в вашем примере.

185 голосов
/ 07 августа 2009

Цитировать стандарт, для уточнения:

12.6.2.5

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

...

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

...

12 голосов
/ 17 августа 2016

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

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

...