我發現這個有趣的一點在Boost.Range:爲什麼Boost.Range range_begin/end free函數爲const和非const引用都重載?
在提供free-standing functions range_begin/end()
, the docs state that:
...
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;
}
你會注意到(和example given in the docs也做到這一點),這兩個版本返回相同Iterator
類型。
爲什麼我們首先需要過載?它是否使ADL工作?
在你的例子中,'M :: f'是一個非模板函數。這有什麼不同(這裏)? –
@MartinBa只要'M :: f'同時具有'S&'和'const S&'版本,它就可以工作。爲此,這些重載是否由模板提供並不重要。 – hvd