From cppreference :
Элемент может быть создан, даже если в контейнере уже есть элемент с ключом, и в этом случае вновь созданный элемент будет уничтожен немедленно.
Причиной такого поведения является то, что контейнер должен создать ключевой объект, чтобы иметь возможность проверить, присутствует ли он уже; сопоставленный объект должен быть создан одновременно, поскольку они являются членами одного и того же объекта (пара value_type
).
try_emplace
(поскольку C ++ 17) является лучший вариант в этом случае, так как он будет создавать сопоставленный объект только в случае успешной вставки. Это можно сделать, поскольку он принимает ключ в качестве первого аргумента и заменяет сопоставленный объект из оставшихся аргументов, что приводит к гораздо более приятному интерфейсу:
m.try_emplace(1, 2);
m.try_emplace(1, 2);
^ key (copied or moved)
^ mapped_type emplacement args (forwarded)