В «Инициализаторе» выполняется присвоение, а не инициализация (при условии допустимого синтаксиса).
Как таковой, он «решает» фиаско статического порядка инициализации для вашего особого случая, , потому что фиаско в первую очередь отсутствует . x и y являются целыми числами, они не вызывают друг друга в непредсказуемое время, и, кроме того, они также живут в одной и той же единице перевода. Компилятор просто правильно их инициализирует. Это нормально, если вы назначаете значения в определенном порядке впоследствии, но это только сложнее, а не лучше.
Чтобы фиаско статического порядка инициализации появилось, вам понадобится такая ситуация: для конструктора x требуется значение y (или наоборот), и они находятся в разных единицах перевода. Таким образом, с вероятностью 50:50 это работает или нет.
Теперь структура "Initializer" будет правильно присваивать значения в определенном порядке, но в это время конструкторы для x и y уже запущены, потому что вы можете ' присваивать то, что не было построено ... так что это вообще не позволило бы избежать проблемы, если бы она существовала.
Построение при первом использовании - распространенный способ решения этой проблемы. Существуют различные разновидности этого метода (каждый со своими преимуществами и недостатками), например, например:
x& get_x() { static x *xxx = new x(); return *xxx; }