Std:: map:: insert change in С++ 17

Я вижу, что метод insert std::map и std::unordered_map будет меняться от

template<class P> std::pair<iterator,bool> insert(P&& value); (C++11)

к

std::pair<iterator,bool> insert(value_type&& value);  (C++17)

Однако для этих контейнеров value_type есть std::pair<A const, int>. Здесь два вопроса:

  • Почему это изменение? Что такое потенциал роста?
  • Как это будет работать, чтобы переместить ключ при вставке? Версия С++ 11 принимает что-либо (ограничение на P равно default_constructible<value_type, P&&>), затем std::pair<A, int> - это большую часть времени, когда тип этого аргумента совпадает с типом, возвращаемым std::make_pair, и может вызовите конструктор перемещения A. Но в версии С++ 17 этот аргумент передается в value_type, где A является const, а затем не движется. A должен быть скопирован, если я не пропускаю что-то. Или С++ 17 что-то изменит с этой стороны?

Спасибо!

Ответ 1

В С++ 17 добавлена ​​дополнительная не-шаблонная перегрузка в insert.

Такая перегрузка имеет то преимущество, что она позволяет построить синтаксис .insert( { {key}, {value, args} } ) - {}. Аргументы template не могут быть переданы инструкциями построения {} без явного типа.