2016-09-12 6 views
12

Я вижу, что insert метод std::map и std::unordered_map будет меняться отстанд :: изменение :: Карта вставки в C++ 17

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>. Два вопроса здесь:

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

Спасибо!

+3

Похоже, эта функция была добавлена ​​[LWG 2354] (http://wg21.link/lwg2354). –

+7

Это не «от X до Y». Это дополнительная перегрузка. –

ответ

9

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

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

+0

Thanks; действительно, это дополнительная перегрузка, которая позволит написать эту конструкцию '{}', но она по-прежнему будет рассматриваться как 'std :: pair ', поэтому я думаю, что 'key' в вашем примере выиграл 'переместить, но скопировать ...? Я на самом деле очень уверен, что ребята из C++ подумали об этом, и он будет перемещен, я просто не вижу * how *, если он const :) – AntiClimacus

+0

@AntiClimacus Он будет называть конструкторы 'std :: pair', независимо от того, что они находятся. Если 'std :: pair ' может быть построено (скажем) '(Key &&, Value &&)', тогда данные могут быть перемещены в 'insert'. Однако он не мог быть перенесен - в данные в дереве, да. – Yakk

 Смежные вопросы

  • Нет связанных вопросов^_^