根据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)
)是prvalue,但它无法移动到容器,因为参数类型为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。答案 0 :(得分:4)
(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,从来不会考虑删除或修改它。