Это не прямая инициализация.T a = b;
называется инициализация копирования .Прямая инициализация - T a(1, 'foo', false);
, и в своем конструкторе вы должны написать знакомый T(int b) : a(b, 'foo', false) { }
для достижения этого эффекта, как у вас уже есть в вашем первом примере.
В отличие от этого, T a;
называется Инициализация по умолчанию , чего вы достигнете, оставив переменную в списке инициализаторов полностью без упоминания.Его эффект заключается в том, чтобы вызвать конструктор по умолчанию для типов классов и вообще не выполнять инициализацию для фундаментальных типов (то же самое для массивов).
В отличие от этого, инициализация значения может быть записана какT(int b) : a() { }
.Вы также можете использовать инициализацию значения в выражениях new
, но они сложнее в автоматических объявлениях из-за неприятного разбора.
Я думаю, что прямая инициализация, инициализация по умолчанию и значения являются единственно допустимыми формами инициализации в инициализаторесписки в C ++ 98/03, в то время как C ++ 11 добавляет различные варианты равномерной инициализации в смесь.