Инициализация std::unordered_map
Когда я впервые получаю доступ к элементу в std::unordered_map, используя operator [], он создается автоматически. Что (если таковые имеются) гарантии относительно его инициализации? (Гарантируется, что значение будет инициализировано или только будет построено)?
Пример:
std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
Гарантируется ли размер [test] равным 10 в конце этой последовательности?
2 ответа
Гарантируется ли размер [test] равным 10 в конце этой последовательности?
Да. В последней строке вашего кода size[test]
значение инициализирует элемент T()
или в этом случае size_t()
:
C++ 11 23.4.4.3 доступ к элементу карты [map.access]
T& operator[](const key_type& x)
;1 Эффекты: если на карте нет ключа, эквивалентного x, вставляет value_type (x, T ()) в карту.
Относительно T()
точный язык несколько сложен, поэтому я постараюсь процитировать соответствующие биты:
C++ 11 8.5.16 Семантика инициализаторов следующая.
- Если инициализатором является (), объект инициализируется значением.
8.5.7 Инициализация значения объекта типа T означает:
- если T является (возможно, cv-квалифицированным) типом класса...
- если T является (возможно, cv-квалифицированным) типом несоединения классов...
- если T является типом массива, то каждый элемент инициализируется значением;
- иначе объект инициализируется нулями.
8.5.5. Обнуление инициализации объекта или ссылки типа T означает:
- если T скалярного типа (3.9), объекту присваивается значение 0 (ноль), принимаемое как целочисленное константное выражение, преобразованное в T;
Какая разница? Инициализация значений для объектов типа класса влечет за собой конструкцию по умолчанию, поэтому ответ "оба". Для карты <K, V>
новый объект будет инициализирован с V()
,
Все стандартные контейнеры инициализируют новые элементы с помощью инициализации по значению или прямой (последний, возможно, через конструкцию копирования). Невозможно, чтобы новые стандартные элементы контейнера находились в "неинициализированном" состоянии (т. Е. Не существует механизма, который по умолчанию-инициализирует элементы).