std :: map operator [] и автоматически создаваемые новые объекты - PullRequest
1 голос
/ 07 мая 2010

Я немного напуган чем-то вроде этого:

std::map<DWORD, DWORD> tmap;
  tmap[0]+=1;
  tmap[0]+=1;
  tmap[0]+=1;

Поскольку DWORD не инициализируются автоматически, я всегда боюсь, что tmap [0] будет случайным числом, которое увеличивается на единицу.Откуда карта знает, как инициализировать DWORD, если среда выполнения не знает, как это сделать?

Гарантируется ли, что результат всегда будет tmap[0] == 3?

Ответы [ 3 ]

4 голосов
/ 07 мая 2010

Да. Когда новое значение вставляется в карту с помощью operator[], оно инициализируется значением , а для встроенных числовых типов (DWORD является typedef для встроенного типа) это означает ноль.

3 голосов
/ 07 мая 2010

Новый объект при вставке в карту оператором [] имеет значение , инициализированное значением . Это обеспечивается реализацией карты, то есть в этом смысле это делается «автоматически». Для объектов типа DWORD (при условии, что это скалярный тип), инициализация значения означает инициализацию с нуля.

По определению, приведенному в 23.3.1.2, operator [] является сокращением для

(*((insert(make_pair(x, T()))).first)).second

Бит T() - это новый объект, который в вашем случае превратится в DWORD(). DWORD() гарантированно равно нулю.

0 голосов
/ 07 мая 2010

Да. Если ключ, который вы передали operator[], не существует, то map по умолчанию создаст объект и вставит его. В вашем случае это будет DWORD(), что даст значение 0.

...