以下代码工作正常:
std::map<int, int>& m = std::map<int, int>();
int i = m[0];
Run Code Online (Sandbox Code Playgroud)
但不是以下代码:
// error C2678: binary '[' : no operator...
const std::map<int, int>& m = std::map<int, int>();
int i = m[0];
Run Code Online (Sandbox Code Playgroud)
大多数时候,由于理由,我更喜欢让我的大部分东西变成不变的:
http://www.javapractices.com/topic/TopicAction.do?Id=29
我看一下地图源代码.它有
mapped_type& operator[](const key_type& _Keyval)
Run Code Online (Sandbox Code Playgroud)
有什么理由,为什么std :: map无法提供
const mapped_type& operator[](const key_type& _Keyval) const
Run Code Online (Sandbox Code Playgroud)
原因是std::map语义声明如果您尝试访问不存在的键的元素,则使用默认构造的元素创建键.换句话说m[0],如果尚不存在,则将在位置0处创建一个int.显然,这与const映射不兼容.
你可以说"好吧,制作一个const版本operator[]并让它不要那样做!"但是有两个问题:语义上的差异是不明显和令人困惑的,如果你尝试的话,目前还不清楚究竟会发生什么访问不存在的密钥(抛出异常?).
相反,你应该做的是使用find()地图上的方法,它将返回指向你正在寻找的键/值对的迭代器.查找完全一样有效operator[],它可以在const映射上使用(在这种情况下返回一个const迭代器),end()如果键不存在,它将返回迭代器.