在这样的范围内:
for ( for-range-declaration : expression ) statement
该标准规定,如果表达式是类类型,编译器会查找成员( (expression).begin(), (expression).end())或自由函数(begin((expression)), )。end((expression))
因此,您可以提供成员函数或自由函数(需要在依赖于参数的查找范围内)。
C++11,第 6.5.4 节 [stmt.ranged]
这是基于范围的 for 根据标准所做的:
for ( for-range-declaration : expression ) statement
range-init = ( expression )
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin )
{
for-range-declaration = *__begin;
statement
}
}
和begin-expr被end-expr描述为:
if_RangeT是数组类型,begin-expr和end-expr是_ range和_range + _ bound分别在哪里_bound是数组绑定。如果_RangeT是一个未知大小的数组或一个不完整类型的数组,则程序是非良构的;
如果_RangeT是类类型,则在类 _RangeT 的范围内查找非限定 ID 的开始和结束,就像通过类成员访问查找 (3.4.5) 一样,并且如果其中一个(或两者)找到至少一个声明,则 beginexpr 和end-expr 分别是 __range.begin() 和 __range.end();
否则,begin-expr和end-expr分别是begin(__range)和end(__range),其中begin和end使用参数相关查找 (3.4.2) 进行查找。出于此名称查找的目的,命名空间 std 是一个关联的命名空间。