Ответ 1
При вызове operator[]
, и ключ отсутствует, значение инициализируется с помощью выражения mapped_type()
, которое является конструктором по умолчанию для типов классов, и нулевой инициализацией для интегральных типов.
Рассмотрим следующий код:
map<int,int> m;
for(int i=0;i<10000;++i) m[i]++;
for(int i=0;i<10000;++i) printf("%d",m[i]);
Я думал, что распечатываемые значения будут undefined, потому что примитивные типы не имеют конструктора по умолчанию, но здесь я получил 10000 1 каждый раз, когда я тестировал.
Почему он инициализирован?
При вызове operator[]
, и ключ отсутствует, значение инициализируется с помощью выражения mapped_type()
, которое является конструктором по умолчанию для типов классов, и нулевой инициализацией для интегральных типов.
std:: map:: operator [] вставляет новое значение, если оно не существует. Если выполняется вставка, отображаемое значение инициализируется конструктором по умолчанию для типов классов или нулевым инициализированным в противном случае.
См. https://www.sgi.com/tech/stl/stl_map.h
_Tp& operator[](const key_type& __k) {
iterator __i = lower_bound(__k);
// __i->first is greater than or equivalent to __k.
if (__i == end() || key_comp()(__k, (*__i).first))
__i = insert(__i, value_type(__k, _Tp()));
return (*__i).second;
}
В вашем примере _Tp - int
, а int()
- 0
#include <iostream>
using namespace std;
int main() {
int x = int();
cout << x << endl;
return 0;
}
Кроме того:
благодаря @MSalters, который рассказывает о коде выше, это SGI вместо std:: map, но я думаю, что это похоже...
В стандарте С++ 14, раздел [map.access]
текст:
T& operator[](const key_type& x);
- Эффекты: Если на карте нет ключа, эквивалентного
x
, вставляетvalue_type(x, T())
в карту.
Итак, как и сказал Джозеф Гарвин, результат выражения mapped_type()
- это то, что вставлено. Эта инициализация называется инициализацией значения.
Значение инициализации значения не так просто, как предлагается в других ответах для типов классов. Это зависит от того, какой тип конструктора имеет тип класса, и является ли класс агрегатом, как объясняется ссылкой cppreference.
Для int
, как и в этом вопросе, инициализация значения означает, что для параметра int
установлено значение 0
.