Является ли инициализация значения частью стандарта С++ 98? Если нет, то почему он был добавлен в стандарт С++ 03?

Приветствия и hth. - Alf сделал комментарий в ответе , что инициализация значения, возможно, является новой функцией С++ 03 по сравнению с С++ 98. Интересно, что он имел в виду.

Является инициализация значения частью С++ 98? Является ли это в концепции, но не по имени? Почему он был добавлен в стандарт С++ 03?

У меня есть копия стандарта '03, но не стандарт '98. Здесь определение инициализации по умолчанию и инициализации значения.

Для инициализации объекта типа T по умолчанию:

- если T - тип класса не-POD (раздел 9), конструктор по умолчанию для T называется (и инициализация плохо сформирована, если T не имеет доступный конструктор по умолчанию);

- если T - тип массива, каждый элемент инициализируется по умолчанию;

- в противном случае объект инициализируется нулем.

Для инициализации объекта типа типа T означает:

- если T - тип класса (раздел 9) с объявленным пользователем конструктором (12.1), то по умолчанию конструктор для T (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);

- если T - неединичный класс типа без конструктора, объявленного пользователем, то все нестатические данные член и компонент базового класса T инициализируются значением;

- если T тип массива, то каждый элемент инициализируется значением;

- в противном случае, объект инициализируется нулем

Моя догадка заключается в том, что '98 имел инициализацию по умолчанию, но не инициализацию значения, и что существует некоторое ключевое различие между ними. Честно говоря, у меня проблемы с разбором стандартного здесь, и я не понимаю разницы между определениями.

Ответ 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() во время компиляции, только чтобы он отметьте это во время выполнения! [...]