Элементы, добавленные в std:: map, автоматически инициализируются?

Предположим, что у меня есть отображение

std::map<int, double> foo;

Определено ли поведение моего письма foo[2] += 3.0;? То есть, любые неявно добавленные элементы карты автоматически инициализируются (надеюсь, на 0.0) в моем случае?

Если нет, я представляю грузовик нагрузки undefined? Если да, могу ли я сделать что-то напуганное с помощью распределителя для обеспечения инициализации до 0.0?

Ответ 1

Да, это будет значение-инициализировано (как 0.0 в вашем случае). Согласно cppreference:

Возвращает ссылку на значение, которое сопоставляется с эквивалентом ключа ключ, выполняющий вставку, если такой ключ еще не существует.

Если выполняется вставка, отображаемое значение инициализируется значением (построенный по умолчанию для типов классов, с нулевой инициализацией в противном случае) и возвращается ссылка на него.

Ответ 2

N3337 [map.access]/1 Эффекты: Если на карте нет ключа, эквивалентного x, вставляет value_type(x,T()) в карту.

T() - инициализация значения, которая имеет место для встроенных типов, вызывает нулевую инициализацию. Таким образом, foo[2] будет вставлять нулевую инициализацию double в вашу карту, поэтому ваш код будет четко определен.

Ответ 3

Да, они автоматически инициализируются значением при использовании operator[] для не существующего ключа. В частности, в стандарте он описан в §23.4.4.3/1 (когда речь идет о operator[]):

Эффекты: Если в карте нет ключа, эквивалентного x, вставляет value_type(x, T()) в карту.

Для большинства числовых типов, включая double, выражение T() дает элемент с инициализацией значения этого типа, поэтому в вашем случае будет 0.0.