Стандарт C ++ 11 по-прежнему требует, чтобы std :: map обнулял встроенные типы (как и предыдущий стандарт), но причины немного отличаются от тех, что приведены в ответе Люка Холливелла. В частности, «инициализация по умолчанию» для встроенного типа данных не означает , что означает «инициализация нуля» в стандарте C ++ 11, а скорее означает «ничего не делать». То, что на самом деле происходит в std::map::operator[]
, является «инициализацией значения».
Тем не менее, конечный результат в новом стандарте такой же, как в ответе Люка. Значения будут инициализированы нулями. Вот соответствующие части стандарта:
Раздел 23.4.4.3 «Доступ к элементу карты» говорит
T & operator [] (const key_type & x);
Эффекты: если на карте нет ключа, эквивалентного x, вставляется value_type(x, T())
в карту.
...
Выражение T()
описано в разделе 8.5
Объект, инициализатором которого является пустой набор скобок, т. Е., (), Должен быть инициализированным значением .
X a();
И этот тип 'инициализации значения' описан в том же разделе
Инициализация значения объекта типа T означает:
- если T является (возможно, cv-квалифицированным) типом класса (раздел 9) с предоставленным пользователем конструктором (12.1), тогда конструктор по умолчанию для T
называется (и инициализация плохо сформирована, если T не имеет доступных
конструктор по умолчанию);
- если T является (возможно, cv-квалифицированным) типом класса без объединения без конструктора, предоставленного пользователем, то объект инициализируется нулями и, если
Неявно объявленный конструктор T по умолчанию является нетривиальным, что
конструктор называется.
- если T является типом массива, то каждый элемент инициализируется значением;
- в противном случае объект инициализируется нулями.