我有以下代码
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()不应该表现相同吗?
答案 0 :(得分:4)
operator[]
的{{1}}和at()
行为不一样吗?
没有。如果找不到密钥,则unordered_map
将抛出异常,而at
将插入带有该密钥的新元素。为此,所提供的密钥必须是可复制的或可移动的;您的密钥类型不可复制,只有作为 rvalue 传递时才可移动。所以这应该编译:
[]
当然,使用cout << _unordered_map[std::move(_ptr3)];
或[]
没什么意义,因为你不能创建一个非空的at
,它将与地图中的任何一个相等(除非,因为,在您的示例中,您创建了两个unique_ptr
拥有相同的对象,这将是灾难性的。)