std::map::insert C++17 中的变化

std::map::insert change in C++17

我看到 std::mapstd::unordered_mapinsert 方法将从

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 是 const,则不可移动。如果我没有忽略某些内容,则必须复制 A。或者 C++17 也改变了这方面的任何东西吗?

谢谢!

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

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