나는 Boost.Range이 흥미로운 비트를 발견Boost.Range range_begin/end free 함수가 const 및 non-const 참조 모두에 오버로드되는 이유는 무엇입니까?
free-standing functions range_begin/end()
, the docs state that를 제공 할 때 :
...
이range_begin()
및range_end()
모두const
및mutable
참조 인수 오버로드해야합니다.////////////////////////////////////////////////////////////////////// // 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
형식을 반환하는 것이 :
그리고 실제로, end.hpp
에 기본값을보고, 우리는 참조하십시오.
왜 우리는 처음에 두 가지 과부하가 필요합니까?ADL을 작동시키는가요?
예에서'M :: f'는 템플릿이 아닌 함수입니다. 이 점이 차이점이 있습니까? –
@MartinBa'M :: f'에는'S &'와'const S &'버전이 모두있는 한 작동해야합니다. 이를 위해 템플리트에서 이러한 과부하를 사용할 수 있는지 여부는 중요하지 않습니다. – hvd