Нет, это не определено. A
будет инициализирован первым (первым в определении класса) и использует неинициализированный B
.
Члены класса инициализируются в том порядке, в котором они указаны в определении класса, независимо от их порядка в списке инициализации. На самом деле, неправильно совмещать порядок определения элементов с порядком списка инициализации.
Если ваш экземпляр Foo
имеет статическую длительность, как в Foo f(0); int main(){}
, поведение четко определено. Объекты со статической длительностью инициализируются нулями перед любой другой инициализацией; в этом случае A
и B
будут 0 при запуске конструктора. После этого, однако, поведение остается таким же: сначала A
, затем B
, что дает A
значение 123 и B
значение Bar
(все еще безобразно).