我在Boost.Range中发现了这个有趣的部分:
在提供独立功能range_begin/end()
时,文档声明:
...
range_begin()
并且range_end()
必须为两个const
和mutable
引用参数重载。
事实上,查看它们在 中的默认值end.hpp
,我们看到:
//////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////
template< typename Iterator >
inline Iterator range_end( const std::pair<Iterator,Iterator>& p )
{
return p.second;
}
template< typename Iterator >
inline Iterator range_end( std::pair<Iterator,Iterator>& p )
{
return p.second;
}
您会注意到(文档中给出的示例也这样做)两个版本都返回相同的Iterator
类型。
为什么我们首先需要两个重载?是为了让ADL工作吗?