Ура и hth. — Альф сделал комментарий в этом ответ эта инициализация значения, возможно, является новой особенностью C ++ 03 по сравнению с C ++ 98. Интересно, что он имел в виду.
Является инициализация значения часть C ++ 98? Это присутствует в концепции, но не в названии? Почему он был добавлен в стандарт C ++ 03?
У меня есть копия стандарта ’03, но нет стандарта ’98. Вот определение инициализации по умолчанию и инициализации значения.
По умолчанию инициализировать объект типа T означает:
— если T является типом класса не POD (раздел 9), конструктор по умолчанию для
T называется (и инициализация плохо сформирована, если T не имеет
доступный конструктор по умолчанию);— если T является типом массива, каждый элемент инициализируется по умолчанию;
— иначе объект инициализируется нулями.
Инициализировать значение объекта типа T означает:
— если T является типом класса
(раздел 9) с объявленным пользователем конструктором (12.1), то по умолчанию
конструктор для T называется (и инициализация плохо сформирована, если T
не имеет доступного конструктора по умолчанию);— если T не является объединенным классом
тип без объявленного пользователем конструктора, затем все нестатические данные
член и компонент базового класса T инициализируются значением;— если Т
тип массива, тогда каждый элемент инициализируется значением;— иначе,
объект инициализируется нулями
Я предполагаю, что ’98 имел инициализацию по умолчанию, но не инициализацию значения, и что между ними есть некоторое ключевое различие. Честно говоря, у меня возникают проблемы при разборе стандартного кода здесь, и я не понимаю разницы между определениями.
квотирование стандартный документ 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 является типом массива, то каждый элемент инициализируется значением;
- в противном случае хранилище для объекта инициализируется нулями.
Кроме того, я предлагаю изменить ‘‘ default-initialization ’’ на
‘« Инициализация значения »в п. 2 5.2.3.
И, после этого, историческое объяснение:
Древняя история
Давным-давно, AT&T-разработчик компилятора по имени Laura Eaves спросил
я: ‘‘ Какова должна быть ценностьint()
? »Впервые я подумал, что
это должно быть то же значение, что иx
после сказанногоint x;
но вскоре я понял, что это определение не подойдет. Причина в
что х имеет неопределенное значение (при условии, что это локальное
переменная), но мы не противx
неопределенна, потому что мы
предположительно собирается присвоить значениеx
прежде чем мы используем это. По сравнению,
int()
лучше не иметь неопределенное значение, потому что копирование
такое значение имеет неопределенный эффект. Было бы глупо запретить
компилятор от пометкиint()
во время компиляции, только чтобы
пометить во время исполнения! […]