2012-01-20 1 views
6

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

Пример:

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

ли размер [тест] гарантированно 10 в конце этой последовательности?

ответ

16

Является ли размер [тест] гарантией быть 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 Семантика инициализаторах заключаются в следующем.

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


8.5.7 Для значение инициализации объект типа Т означает:

- если Т (возможно, резюме квалифицированных) тип класса ...

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

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

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


8.5.5 Для нулевой инициализации объект или ссылка типа Т означает:

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

+0

Я прочитал эту часть документов, но я не был уверен в ее последствиях. Что означает «построенный по умолчанию» для интегрального типа, такого как size_t? (Можете ли вы привести стандарт, желательно?) – Suma

+0

@Suma: интегральные типы не являются типами классов, поэтому у них нет конструкторов. Инициализация значений этих типов равна нулевой инициализации. (Глава 8.) –

+0

@KerrekSB вы уверены, что не путаете C++ с Java? Встроенные объекты по умолчанию не имеют нуля. – spraff

0

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

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

+0

Я предположил, что «сконструирован» в том смысле, что, когда я использую переменную int member в классе, конструктор класса по умолчанию не инициализирует значение. Я думаю, вы правы, но инициализация значений гарантирована фразой «по умолчанию»? Что делать, если V будет POD? Будет ли оно построено по умолчанию (т. Е. Неинициализировано) или инициализировано значение? – Suma

+0

@Suma: 'V' инициализируется значением, поэтому, если' V' является фундаментальным, оно инициализируется нулем, и если оно является классом, оно построено по умолчанию. Для составных типов вы применяете правила рекурсивно. –