c++ - std::unordered_map::insert 重载重载

标签 c++ c++11

根据 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&& 的函数不存在?

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

最佳答案

“失踪”value_type&&过载 insert对于 ( unordered_ )( multi ) map是故意的。 value_typepair<const key_type, value_type> . constkey_type 上移动语义游行几乎下雨了。

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

做出该决定时,尚未提出统一的初始化建议。因此,在标准化之前从未彻底研究过与之交互的问题(只是时间/人力不足)。

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

关于c++ - std::unordered_map::insert 重载重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757809/

相关文章:

c++ - 在 Arduino 上使用最少数量的 PWM 引脚连接多个 RGB LED?

c++ {*this} 在花括号内

c++ - 从 time_point + duration 到 duration 的转换在 clang 上失败

c++ - 为什么将 auto 推导出为 int 而不是 uint16_t

android - 安卓NDK |如何确定 NDK 9c 支持哪种 C++ 标准

c++ - 宏中的#value 是什么意思

c++ - 分发用 CLion 编写的 C++ 时的构建说明

c++ - 为什么 std::span 缺少 size_type?

C++11 constexpr 过时的模板元编程?

c++ - 如何传递信号回调(使用 boost::bind)