Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

std::map::operator[]: инициализация при обращении к несуществующему элементу

#cpp


Есть такой код:

    std::map m;
    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.

Комментариев нет:

Отправить комментарий