#cpp
Есть такой код: std::mapm; int a = m[0]; Есть ли гарантия, что a будет содержать 0? Или есть вероятность что там будет мусор? Общий вопрос: выполняется ли инициализация простых типов(char, int, float) при чтении несуществующего элемента map? Или там будет мусор, как это происходит с объявлениями переменных без инициализации, и нужно всегда инициализировать элементы map вручную?
Ответы
Ответ 1
Да, гарантия есть. В "классическом" С++98 поведение такого operator[] при новом ключе x описывалось как вставка элемента make_pair(x, T()), где T - тип данных map. В вашем случае это int и выражение int() порождает нулевое значение. Начиная с С++11 спецификация operator[] более "запутана". Выполняется конструкция пары через piecewise_construct с пустым списком аргументов для второго элемента. Для типа int такая инициализация выливается в обнуление.Ответ 2
Да, гарантирует. Выполняется инициализация значением (кажется, так она называется). "Стандартная библиотека С++" Н. Джосаттиса, второе издание, стр. 378: "Если ключом является индекс, для которого не существует ни одного элемента, в отображение автоматически вставляется новый элемент. Значение нового элемента инициализируется конструктором по умолчанию для соответствующего типа. ... все элементарные типы имеют конструкторы по умолчанию, инициализирующие их значения нулями." Из стандарта: T& operator[](const key_type& x); 1 Effects: If there is no key equivalent to x in the map, inserts value_type(x, T()) into the map. И об инициализации значением оттуда же: 8 To value-initialize an object of type T means: (8.1) — if T is a (possibly cv-qualified) class type (Clause 9) with either no default constructor (12.1) or a default constructor that is user-provided or deleted, then the object is default-initialized; (8.2) — if T is a (possibly cv-qualified) class type without a user-provided or deleted default constructor, then the object is zero-initialized and the semantic constraints for default-initialization are checked, and if T has a non-trivial default constructor, the object is default-initialized; (8.3) — if T is an array type, then each element is value-initialized; (8.4) — otherwise, the object is zero-initialized.
Комментариев нет:
Отправить комментарий