【发布时间】:2017-01-20 10:47:00
【问题描述】:
我看到std::map 和std::unordered_map 的insert 方法将从
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>。这里有两个问题:
- 为什么会发生这种变化?有什么好处?
- 如何在插入时移动键? 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 在这方面也有任何改变?
谢谢!
【问题讨论】:
-
看起来该功能是LWG 2354添加的。
-
这不是“从 X 到 Y”。这是一个额外的重载。