C ++ unordered_map :: at()和operator []的行为不一样

时间:2014-05-01 11:47:08

标签: c++ c++11 unordered-map

我有以下代码

  unordered_map<unique_ptr<Test>, int> _unordered_map;
  Test* _test1 = new Test;
  unique_ptr<Test> _ptr0(_test1);
  unique_ptr<Test> _ptr1(new Test);

 _unordered_map.insert(make_pair( std::move(_ptr0), 1  ));
 _unordered_map.insert(make_pair( std::move(_ptr1), 1  ));

  unique_ptr<Test> _ptr3(_test1);
  cout <<  _unordered_map.at(_ptr3);
如果我将最后一行更改为

gcc会出现编译错误

cout <<  _unordered_map[_ptr3];

unordered_map的operator []和at()不应该表现相同吗?

1 个答案:

答案 0 :(得分:4)

  

operator[]的{​​{1}}和at()行为不一样吗?

没有。如果找不到密钥,则unordered_map将抛出异常,而at将插入带有该密钥的新元素。为此,所提供的密钥必须是可复制的或可移动的;您的密钥类型不可复制,只有作为 rvalue 传递时才可移动。所以这应该编译:

[]

当然,使用cout << _unordered_map[std::move(_ptr3)]; []没什么意义,因为你不能创建一个非空的at,它将与地图中的任何一个相等(除非,因为,在您的示例中,您创建了两个unique_ptr拥有相同的对象,这将是灾难性的。)