不,ranged-for 循环不使用 operator[]
定义
for ( range_declaration : range_expression ) loop_statement
是不是被当成是(不引入__names)
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
对于begin_expr 和end_expr 有以下规则:
- 如果
range_expression是数组类型的表达式,那么begin_expr是__range,end_expr是(__range + __bound),
其中__bound 是数组中的元素数(如果数组
大小未知或类型不完整,程序是
格式错误)
- 如果 range_expression 是类类型
C 的表达式,它同时具有名为 begin 的成员和名为 end 的成员(无论
此类成员的类型或可访问性),然后 begin_expr 是
__range.begin() 和 end_expr 是 __range.end();
- 否则,
begin_expr 是 begin(__range) 和 end_expr 是 end(__range),通过参数相关查找(非 ADL
不执行查找)。
对你的类做一个简单的改变就足够了,添加begin和end,委托给m.begin()和m.end()
class C {
private:
std::unordered_map<char, int> m = {{'a', 1}, {'b', 2}, {'c', 3}};
public:
int operator[](const char& key) const {
return m.find(key)->second;
// return m.at(key); or return m[key]; are both safer than this
}
std::unordered_map<char, int>::iterator begin() {
return m.begin();
}
// overloaded on the constness of "this"
std::unordered_map<char, int>::const_iterator begin() const {
return m.begin();
}
std::unordered_map<char, int>::iterator end() {
return m.end();
}
// overloaded on the constness of "this"
std::unordered_map<char, int>::const_iterator end() const {
return m.end();
}
};