Инициализация 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(),

Все стандартные контейнеры инициализируют новые элементы с помощью инициализации по значению или прямой (последний, возможно, через конструкцию копирования). Невозможно, чтобы новые стандартные элементы контейнера находились в "неинициализированном" состоянии (т. Е. Не существует механизма, который по умолчанию-инициализирует элементы).

Другие вопросы по тегам