根据 my previous question's answer ,
std::pair<iterator, bool> std::unordered_map::insert(const value_type&)
比
有用template<class P>
std::pair<iterator, bool> std::unordered_map::insert(P&&)
对于某些情况,例如
std::unordered_map<std::string, int> v;
v.insert({"key", 1});
因为编译器无法推导出P
来自 {"key", 1}
. (感谢sellibitze)
然而,虽然这个论点{"key", 1}
(= std::pair<std::string, int>("key", 1)
) 是纯右值,它不能移动到容器,因为参数类型是 const value_type&
.
我的问题是 --- 很抱歉我太执着了 --- 为什么标准选择 const value_type&
对于参数类型而不是 value_type&&
?或者,是否有任何其他原因导致参数类型为 const value_type&
的函数存在且参数类型为 value_type&&
的函数不存在?
编辑: 我创建了一个示例。
- 参数类型为
const value_type&
像 unordered_map: http://ideone.com/GB72fc . - 参数类型为
value_type&&
只有:http://ideone.com/dXnQJr . - 两种参数类型:http://ideone.com/shAb9e .
最佳答案
“失踪”value_type&&
过载 insert
对于 ( unordered_
)( multi
) map
是故意的。 value_type
是 pair<const key_type, value_type>
. const
在 key_type
上移动语义游行几乎下雨了。
我真的很想允许从 pair<key_type, value_type>
移动,因此引入了P&&
重载。事后看来,这可能不是最好的解决方案。然而,这是一个深思熟虑的设计决定。
做出该决定时,尚未提出统一的初始化建议。因此,在标准化之前从未彻底研究过与之交互的问题(只是时间/人力不足)。
const value_type&
重载来自 C++98,从来没有考虑过删除或修改它。
关于c++ - std::unordered_map::insert 重载重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757809/