Элементы, добавленные в 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
.