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を機能させるためですか?