Ответ 1
Цитирование стандартного документа ISO/IEC 14882: 1998 (который был отозван из ISO):
Для инициализации объекта типа
T
по умолчанию:
- если T - тип класса не-POD (раздел 9), вызывается конструктор по умолчанию для
T
(и инициализация плохо сформирована, еслиT
не имеет доступный конструктор по умолчанию);- если T - тип массива, каждый элемент инициализируется по умолчанию;
- в противном случае хранилище для объекта инициализируется нулем.
И в пункте 7:
Объект, инициализатор которого представляет собой пустой набор скобок, т.е.
()
, должен быть инициализирован по умолчанию.
Подробные сведения об обосновании изменения можно найти в отчете о дефектах, из-за которого это произошло:
Это определение подходит для локальных переменных, но не для объекты, которые инициализируются в результате выполнения выражений форма
T()
, поскольку объекты, полученные такими выражениями, будут скопировать сразу, и поэтому должны иметь значения, которые заверил, что он можно копировать.
С этой целью я предлагаю добавить следуя новому тексту 8.5, пункт 5:Для инициализации объекта с типом
T
означает:
- если T - тип класса (раздел 9 [класс]) с объявленным пользователем конструктором (12.1), то конструктор по умолчанию для T вызывается (и инициализация плохо сформирована, если T не имеет доступного значения по умолчанию Конструктор);
- если T является типом класса без конструктора, объявленного пользователем, то каждый нестатический элемент данных и компонент базового класса T Значение инициализирован;
- если T - тип массива, то каждый элемент инициализируется значением;
- в противном случае хранилище для объекта инициализируется нулем.
Кроме того, я предлагаю изменить "инициализацию по умолчанию" на '' Инициализация значений в пункте 5.2.3.2.
И, после этого, историческое объяснение:
Древняя история
Когда-то разработчик компилятора AT & T по имени Лаура Эйвс попросил me: "Какая должна быть ценность
int()
? Моя первая мысль заключалась в том, что он должен быть таким же значением, какx
после того, как сказалint x;
но вскоре понял, что этого определения не будет. Причина в том, что что x имеет неопределенное значение (предполагая, что оно является локальным переменная), но мы не возражаем, что
x
является неопределенным, поскольку мы предположительно, чтобы присвоить значениеx
, прежде чем мы его используем. В противоположность,int()
лучше не иметь неопределенного значения, поскольку копирование такое значение имеет эффект undefined. Было бы глупо запрещать компилятор из флагаint()
во время компиляции, только чтобы он отметьте это во время выполнения! [...]