Implémentation C++98 via tag dispatch, avec
constexpr
supprimé
namespace detail
{template<class It>constexpr// requis depuis C++17typenamestd::iterator_traits<It>::difference_type
do_distance(It first, It last, std::input_iterator_tag){typenamestd::iterator_traits<It>::difference_type result =0;while(first != last){++first;++result;}return result;}template<class It>constexpr// requis depuis C++17typenamestd::iterator_traits<It>::difference_type
do_distance(It first, It last, std::random_access_iterator_tag){return last - first;}}// namespace detailtemplate<class It>constexpr// depuis C++17typenamestd::iterator_traits<It>::difference_type
distance(It first, It last){return detail::do_distance(first, last,
typenamestd::iterator_traits<It>::iterator_category());}
#include <iostream>#include <iterator>#include <vector>int main(){std::vector<int> v{3, 1, 4};std::cout<<"distance(first, last) = "<< std::distance(v.begin(), v.end())<<'\n'<<"distance(last, first) = "<< std::distance(v.end(), v.begin())<<'\n';// le comportement est indéfini (jusqu'à LWG940)staticconstexprauto il ={3, 1, 4};// Depuis C++17 `distance` peut être utilisé dans un contexte constexpr.
static_assert(std::distance(il.begin(), il.end())==3);
static_assert(std::distance(il.end(), il.begin())==-3);}