a = {};
- это присвоение, a
назначается из временного объекта, построенного из {}
.Неявно сгенерированное присваивание выполнит посимвольное присваивание для всех элементов данных, тогда будет смысл, как временный объект инициализируется из {}
.
Это copy-list-инициализация , в качестве эффекта выполняется инициализация значения .
В противном случае, если список фигурных скобок пуст, а T является типом класса сконструктор по умолчанию, выполняется инициализация значения .
В качестве эффекта инициализация значения ,
1), еслиT - это тип класса без конструктора по умолчанию или с предоставленным пользователем или удаленным конструктором по умолчанию, объект инициализированный по умолчанию ;
A
имеет предоставленный пользователемконструктор по умолчанию и как результат инициализация по умолчанию , этот конструктор по умолчанию используется для инициализации временного объекта.Тело предоставленного пользователем конструктора по умолчанию пустое, тогда для временного объекта var4
будет инициализирован по умолчанию конструктором по умолчанию std::string
, все остальные члены данных со встроенным типом будут иметьнеопределенные значения.
- Если я избавлюсь от конструктора по умолчанию - проблема исчезнет.
Тогда поведение значение-инициализация изменится на
(выделено мной)
2), если T - это тип класса с конструктором по умолчанию, который не предоставлен и не удален пользователем (то есть itможет быть классом с неявно определенным или дефолтным конструктором по умолчанию ), , объект инициализируется нулями , а затем инициализируется по умолчанию у него нетривиальный конструктор по умолчанию;
Обратите внимание на разницу, временный объект сначала будет инициализирован нулями .Затем все элементы данных со встроенным типом инициализируются на 0
(var4
по-прежнему инициализируется по умолчанию ).
Если переменная-член класса инициализируется скобками, то ей будет присвоено значение 0 или значение по умолчанию.
Так работает список инициализаторов по умолчанию .
Посредством инициализатора элемента по умолчанию, который является просто инициализатором скобок или равенства, включенным в объявление элемента, который используется, если элемент пропущен в списке инициализатора элемента
Затем все члены данных инициализируются указанным инициализатором;в вашем примере все они инициализированы значением , в результате var4
будет инициализирован по умолчанию , остальные члены инициализированы нулями до 0
.