1

根据我之前的问题的回答

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}. (感谢出售

然而,虽然这个参数{"key", 1}(= std::pair<std::string, int>("key", 1)) 是纯右值,但它不能移动到容器中,因为参数类型是const value_type&

我的问题是——我很抱歉坚持不懈——为什么标准选择const value_type&参数类型而不是value_type&&const value_type&或者,是否存在具有参数类型的函数而具有参数类型的函数value_type&&不存在的任何其他原因?

编辑:我创建了一个示例。

4

1 回答 1

4

for ( )( )的“缺失”value_type&&重载是有意的。 是一个。在移动语义游行中几乎下雨了。insertunordered_multimapvalue_typepair<const key_type, value_type>constkey_type

我真的很想允许从 a 移动pair<key_type, value_type>,从而引入P&&重载。事后看来,这可能不是最好的解决方案。然而,这是一个深思熟虑的设计决定。

在做出该决定时,尚未提出统一初始化提案。因此,在标准化之前从未彻底调查过与它的交互(只是没有足够的时间/人力)。

重载来自const value_type&C++98,从不考虑删除或修改它。

于 2013-02-07T19:18:41.097 回答