2016-09-12 24 views
12

我看到的std::mapstd::unordered_mapinsert方法将改变从的std ::在地图::插入件变化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_typestd::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是常量,然后是不可移动的。如果我没有忽视某些东西,A必须被复制。或者C++ 17是否也改变了这方面的任何东西?

谢谢!

+3

看起来这个功能是由[LWG 2354](http://wg21.link/lwg2354)添加的。 –

+7

它不是“从X到Y”。这是一个额外的过载。 –

回答

9

在C++ 17中添加了一个额外的非模板重载到insert

这样的超载具有的优点是,它允许基于语法{}的构造.insert({ {key}, {value, args} })template参数不能通过{}基于没有显式类型的构造指令。

+0

谢谢;实际上它是一个额外的重载,允许编写这个基于''''的构造,但它仍然会被视为一个'std :: pair ',所以我猜你的例子中的'key'不会被移动,但复制...?我真的很确定C++的人想到这一点,它会被移动,我只是不知道*如何*如果它是const :) – AntiClimacus

+0

@AntiClimacus它会调用'std :: pair'的构造函数,不管它们是什么是。如果'std :: pair '可以通过(比如说)'(Key &&,Value &&)'来构造,那么数据可以被移入'insert'。但是,它不能被移入树中的数据中,是的。 – Yakk