【问题标题】:std::map::insert change in C++17C++17 中的 std::map::insert 更改
【发布时间】:2017-01-20 10:47:00
【问题描述】:

我看到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&lt;A const, int&gt;。这里有两个问题:

  1. 为什么会发生这种变化?有什么好处?
  2. 如何在插入时移动键? C++11 版本接受任何东西(P 上的约束是 default_constructible&lt;value_type, P&amp;&amp;&gt;),然后是 std::pair&lt;A, int&gt;——大多数时候是这个参数的类型,因为它是 std::make_pair 返回的类型——并且可以调用A 的移动构造函数。但是在 C++17 版本中,这个参数被强制转换为 value_type,其中 A 是 const,然后是不可移动的。如果我没有忽略某些内容,则必须复制 A。还是 C++17 在这方面也有任何改变?

谢谢!

【问题讨论】:

  • 看起来该功能是LWG 2354添加的。
  • 这不是“从 X 到 Y”。这是一个额外的重载。

标签: c++ c++11 stl move c++17


【解决方案1】:

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

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

【讨论】:

  • 谢谢;确实这是一个额外的重载,允许编写这个基于{} 的构造,但它仍将被视为std::pair&lt;Key const, Value&gt;,所以我猜你的示例中的key 不会被移动而是复制......?实际上,我很确定 C++ 的人考虑到了这一点,并且它会被移动,我只是看不到 如何 如果它是 const :)
  • @AntiClimacus 它将调用std::pair 的构造函数,无论它们是什么。如果std::pair&lt;const Key, Value&gt; 可以由(比如)(Key&amp;&amp;, Value&amp;&amp;) 构造,那么数据可以移动到insert。但是,它不能被移动到树中的数据中,是的。
猜你喜欢
  • 2018-07-28
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多