我发现这个有趣的一点在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