Prasoon уже дал вам a very good answer. Тем не менее, я хотел бы добавить дополнительную информацию, которую я не мог сжать в комментарий:
Я видел эту ошибку (пренебрежение списками инициализации), сделанный много новичками C++, которые поступали с языков (Java, C#), где все типы являются либо примитивами, либо ссылками. Это не имеет большого значения по умолчанию - инициализировать ссылку на сложный тип с null
, а затем перезаписать его реальным объектом. Однако в C++ типы имеют семантику значений, если ссылочная семантика явно не выбрана (и реализована).
Думайте о своем T
, являющемся дорогостоящим для инициализации. (Для любого определения «дорогой» .Если у вас возникли проблемы с представлением такого типа, просто представьте, что мы говорим о коде драйвера графической карты. Почти для этого кода стоит что-то дорогое.) Поскольку вы можете свободно обращаться к объекту в тело конструктора, которое оно должно быть сконструировано, когда тело конструктора выполнено. В противном случае вы получите доступ к необработанной памяти вместо действительного объекта. (Конструкция - это то, что превращает блок памяти необработанной памяти в действительный объект.)
Итак, когда вы назначаете что-то объекту в теле конструктора, вы назначаете уже полностью сконструированный объект. Поскольку вы не указали конструктор, объект будет построен с использованием его конструктора по умолчанию. Это означает, что объект сначала будет построен по умолчанию, просто чтобы его значение по умолчанию было перезаписано чем-то другим в самый следующий момент.
Это, безусловно, бессмыслица, поэтому у нас есть списки инициализации. Используя их, мы можем указать компилятору, какие конструкторы он должен использовать для построения под-объектов базового класса и члена. Таким образом, объекты создаются с правильным значением немедленно.
Кроме того, как вы обнаружили, списки инициализации - единственный способ инициализировать определенные элементы данных, а именно постоянные объекты, ссылки и объекты типов, которые не имеют доступного конструктора по умолчанию.
@ user242265: Ваша проблема не имеет ничего общего с шаблонами, кстати. – wilx