Я не знаю, каковы причины этого изменения (или каким был стандарт раньше), но в основном инициализация по умолчанию либо вызывает пользовательский конструктор, либо ничего не делает (много ручных операций). -waving здесь: это рекурсивно применяется к каждому подобъекту, что означает, что подобъекты с конструктором по умолчанию будут инициализированы, подобъекты без определенных пользователем конструкторов останутся неинициализированными).
Это описано в §8.5 Инициализаторы, и навигация по нему не является тривиальной. Определения для zero-initialize, default-initialize и value-initialize приведены в 5-м абзаце:
Инициализация нулями объекта типа T означает:
— если T — скалярный тип (3.9), объекту присваивается значение 0 (ноль), преобразованное в T;
- если T является типом класса без объединения, каждый нестатический член данных и каждый подобъект базового класса инициализируются нулями;
- если T является типом объединения, первый именованный элемент данных объекта89) инициализируется нулем;
— если T — тип массива, каждый элемент инициализируется нулями;
— если T является ссылочным типом, инициализация не выполняется.
Инициализация по умолчанию объекта типа T означает:
- если T не является типом класса POD (пункт 9), вызывается конструктор по умолчанию для T (и инициализация является некорректной, если T не имеет доступного конструктора по умолчанию);
— если T является типом массива, каждый элемент инициализируется по умолчанию;
— в противном случае объект инициализируется нулями.
Инициализация значения объекта типа T означает:
- если T является типом класса (раздел 9) с конструктором, объявленным пользователем (12.1), то вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию);
- если T является типом класса без объединения без объявленного пользователем конструктора, то каждый нестатический член данных и компонент базового класса T инициализируется значением;
— если T — тип массива, то каждый элемент инициализируется значением;
— в противном случае объект инициализируется нулями
Программа, которая вызывает инициализацию по умолчанию или инициализацию значения объекта ссылочного типа, имеет неправильный формат. Если T является типом cv-qualified, то cv-unqualified версия T используется для этих определений Zeroinitialization, default-initialization и value-initialization.
()
? Я уверен, что в конкретном случаеstd::map
std::pair<A,B>()
может явно вызывать конструкторы дляA
иB
. - person Mark Ransom   schedule 17.08.2011