随着 C++11 的出现,我们有 unordered_map.cbegin/cend 专门返回我们的 const_iterator 值。所以表达式“auto it = unordered_map.cbegin()”中“it”的推导类型是 const_iterator。
但是,当涉及到 unordered_map.find(key) 函数时,我认为可能缺少一个“cfind()”对应项,它专门返回一个 const_iterator。
有人说我们可以使用“const auto it = unordered_map.find(key)”来获得一个“const iterator”,但我强烈怀疑“const iterator”是同一个“const_iterator”,其中“const iterator”有限制更改迭代器本身的能力,而“const_iterator”限制了更改迭代器所指内容的能力。
所以,真的,如果我们想充分利用“auto”类型推导(了解混淆或“auto”类型推导的变体 - auto、auto&、const auto& 等),我怎么能拥有 unordered_map .find(key) 返回一个“const_iterator”,而无需我明确指定“const_iterator”——毕竟这是 auto 的最佳用例!
下面是一个演示编译器行为的简单示例代码:
#include "stdafx.h"
#include <unordered_map>
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::unordered_map<int, int> umiit;
umiit umii;
auto it0 = umii.find(0);
it0->second = 42;
const auto it1 = umii.find(0);
it1->second = 42;
umiit::const_iterator it2 = umii.find(0);
it2->second = 42; // expected compiler error: assigning to const
return 0;
}