Ответ 1
mem-initializer выполняется сначала в том порядке, в котором они были объявлены в определении класса, и затем выполняется тело конструктора.
Для справки проект стандарта С++ гласит:
В конструкторе без делегирования инициализация выполняется в следующем порядке:
[...]
Затем нестатические элементы данных инициализируются в том порядке, в котором они были объявлены в определении класса (опять же независимо от порядка mem-инициализаторов).
Наконец, составная инструкция тела конструктора выполняется
Если вы не присвоили значение b
в теле конструктора, оно будет иметь неопределенное значение.
Чтобы уточнить ответ который вы упомянули, часть ответа, на которую вы, похоже, ссылаетесь, такова:
если вы используете назначение, тогда поля будут сначала инициализированы конструкторы по умолчанию, а затем переназначенные (через оператор присваивания) с фактическими значениями.
то, что они хотели сказать, было то, что он будет инициализирован по умолчанию, который в случае для int означает неопределенное значение, из черновика стандарта С++:
Если для объекта не задан инициализатор, объект по умолчанию инициализируется. При хранении для объекта с автоматическим или динамическая длительность хранения, объект имеет неопределенный значение, и если для объекта не выполняется инициализация, это объект сохраняет неопределенное значение до тех пор, пока это значение не будет заменено (5,17).
Обратите внимание, что с использованием неопределенного значения - undefined поведение.