std :: map ::在C++中插入更改17

Ant*_*cus 12 c++ stl move c++11 c++17

我看到insert的方法std::map,并std::unordered_map打算从改变

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

std::pair<iterator,bool> insert(value_type&& value);  (C++17)
Run Code Online (Sandbox Code Playgroud)

但是,对于这些容器,value_typestd::pair<A const, int>.这里有两个问题:

  1. 为何如此改变?有什么好处?
  2. 如何在插入时移动密钥?C++ 11版本接受任何东西(对Pis 的约束default_constructible<value_type, P&&>),然后std::pair<A, int>- 这是大多数时候这个参数的类型,因为它是返回的std::make_pair- 并且可以调用它的移动构造函数A.但是在C++ 17版本中,这个参数被转换为value_type,其中A是const,然后是不可移动的.如果我没有忽略某些东西,则必须复制.或者C++ 17也改变了这方面的任何东西?

谢谢!

Yak*_*ont 9

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

这种过载的优点是它允许基于.insert( { {key}, {value, args} } )语法{}的构造. template如果没有{}显式类型,则无法基于构造指令传递参数.