Согласно cppreference.com, std::map::operator[]
для несуществующего значения выполняется нулевая инициализация.
Однако на том же сайте не упоминается нулевая инициализация, за std::unordered_map::operator[]
исключением того, что у него есть пример, который опирается на это.
Конечно это просто ссылочный сайт, а не стандартный. Итак, приведенный ниже код в порядке или нет?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
std::optional
?std::optional
Объект , который содержит не содержащееся значение по - прежнему является инициализированным объект.std::optional
has_value
что проверю это, но это не удастся, поэтому я думаю, что вы правы.Ответы:
В зависимости от того, о какой перегрузке мы говорим,
std::unordered_map::operator[]
это эквивалентно [unord.map.elem](перегрузка принимает RValue-ссылку просто перемещается
k
вtry_emplace
и в остальном идентичны)Если элемент существует под ключом
k
на карте, тоtry_emplace
возвращает итератор для этого элемента иfalse
. В противном случаеtry_emplace
вставляет новый элемент под ключомk
и возвращает итератор для него иtrue
[unord.map.modifiers] :Для нас интересен случай, когда еще не было элемента [unord.map.modifiers] / 6 :
(перегрузка принимает RValue-ссылку просто перемещается
k
вforward_as_tuple
и, опять же , в остальном идентичны)Поскольку
value_type
этоpair<const Key, T>
[unord.map.overview] / 2 , это говорит нам о том, что новый элемент карты будет построен как:Так
args
как при поступлении из него пустоoperator[]
, это сводится к тому, что наше новое значение создается как членpair
из аргументов from no [pair.pair] / 14, что является прямой инициализацией [class.base.init] / 7 значения типа,T
используя()
как инициализатор, который сводится к инициализации значения [dcl.init] /17.4 . Значением инициализацииint
является нулевая инициализация [dcl.init] / 8 . И нулевая инициализацияint
естественно инициализирует этоint
к 0 [dcl.init] / 6 .Так что да, ваш код гарантированно вернет 0 ...
источник
На сайте, на который вы ссылаетесь, написано:
Таким образом,
int
это значение инициализируется :Вот почему результат
0
.источник