Ответ 1
Так что мне интересно, гарантировано ли что
t.a == 0
иt.b == 1
?
Это всегда будет истинным, если a
предшествует b
в объявлении класса и ничего не вызывает f()
между инициализацией a
и b
. Члены класса инициализируются в том порядке, в котором они объявлены в классе. [Class.base.init]/11:
В конструкторе без делегирования инициализация выполняется в следующем порядке: [...]
- Затем нестатические элементы данных инициализируются в том порядке, в котором они были объявлены в определении класса (опять же, независимо от порядка mem-инициализаторов).
Так как a
предшествует b
, тогда, когда конструктор инициализирует a
, он сначала вызовет f()
, а затем повторит его второй раз, когда он инициализирует b
.
Мы также знаем, что существует точка последовательности между инициализатором элемента, потому что [class.base.init]/7:
[...] Инициализация, выполняемая каждым mem-инициализатором, представляет собой полное выражение. Любое выражение в mem-инициализаторе оценивается как часть полного выражения, которое выполняет инициализацию.
указывает, что каждый инициализатор является полным выражением, и каждое полное выражение секвенировано: [intro.execution]/14
Каждое вычисление значения и побочный эффект, связанные с полным выражением, секвенируются перед вычислением каждого значения и побочным эффектом, связанным со следующим полным выражением, которое должно быть оценено.