В настоящее время я читаю документы на С++ 1y, сейчас я пытаюсь понять статью n3873 под названием Улучшенный интерфейс вставки для карт уникальных ключей. В документе указывается, что существует проблема с методами вставки и emplace, это иллюстрирует проблему в следующем примере:
std::map<std::string, std::unique_ptr<Foo>> m;
m["foo"];
std::unique_ptr<Foo> p(new Foo);
auto res = m.emplace("foo", std::move(p));
И после кода выше, он выражает следующее:
Каково значение
p
? В настоящее время не указано, было ли перемещеноp
. (Ответ заключается в том, что это зависит от реализации библиотеки.)
Хорошо, у меня возникают проблемы при поиске объяснения предыдущей цитаты, главным образом потому, что я не могу найти, где в стандарте указано, что в коде, подобном приведенному выше, перемещаться или не перемещаться p
определяется реализация; глядя на n3690 standard раздел ассоциативных контейнеров (23.2.4) о emplace(args)
(Вставляет объект value_type
t
, построенный с помощью std::forward<Args>(args)
) и insert(t)
только упоминает, что значение вставлено или установлено...
... тогда и только тогда, когда в контейнере нет элемента с ключом, эквивалентным ключу
t
.
Ни слова о перемещении (или нет) значения t
; с другой стороны, управляемая память p
освобождается в любом случае (если она перемещается p
освобождается после no-insertion, а если не перемещается, это освобождается объявлением конца области), не так ли?
После введения позвольте мне задать следующие вопросы:
- Зачем перемещать значение при вставке/вставке в ассоциативный контейнер, у которого уже есть вставленный ключ, задает значение в неуказанном состоянии?
- Где указано, что эта операция определена реализацией?
- Что происходит с
p
примера? Действительно ли это освобождено?
Пожалуйста, попробуйте простить, если вопрос выглядит глупым или с очевидным ответом, это может быть связано с отсутствием навыков понимания английского языка или потому, что я не привык нырять в стандартные документы. Любые рекомендации будут оценены.