инициализация std :: unordered_map - PullRequest
11 голосов
/ 20 января 2012

Когда я впервые получаю доступ к элементу в std :: unordered_map с помощью оператора [] , он создается автоматически.Каковы (если таковые имеются) гарантии о его инициализации?(Гарантируется, что значение будет инициализировано или только будет создано)?

Пример:

std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;

Гарантируется, что размер [test] будет равным 10 в конце этой последовательности?

Ответы [ 2 ]

23 голосов
/ 20 января 2012

Гарантируется ли размер [test] равным 10 в конце этой последовательности?

Да.В последней строке вашего кода size[test] value инициализирует элемент в T(), или в этом случае size_t():

C ++ 11 23.4.4.3 доступ к элементу карты [картаДоступкарта.

Что касается T(), точный язык несколько сложен, поэтому я постараюсь процитировать соответствующие биты:

C ++ 118.5.16 Семантика инициализаторов следующая.

- Если инициализатором является (), объект инициализируется значением.


8.5.7 К значение-инициализировать объект типа T означает:

- если T является (возможно, cv-квалифицированным) типом класса ...

- если T является (возможно, cv-квалифицированным) типом несоединения классов ...

- если T является типом массива, то каждый элемент инициализируется значением;

- в противном случае объект инициализируется нулями.


8.5.5 К инициализации нулями объект или ссылка типа T означает:

- если T скалярного типа (3.9), объектустанавливается в значение 0 (ноль) , принимается как целочисленное константное выражение, преобразуется в T;

0 голосов
/ 20 января 2012

Какая разница? Инициализация значений для объектов типа класса влечет за собой конструкцию по умолчанию, поэтому ответ «оба». Для карты <K, V> новый объект будет инициализирован с V().

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

...