¿Por qué ADL no funciona con Boost.Range?

Considerando:

#include <cassert>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm.hpp>

int main() {
    auto range = boost::irange(1, 4);
    assert(boost::find(range, 4) == end(range));
}

Demostración en vivo de Clang Demo en vivo de GCC

esto da:

main.cpp: 8: 37: error: uso del identificador no declarado 'fin'

Considerando que si escribesusing boost::end; esofunciona bien, lo que implica queboost::end es visible:

¿Por qué ADL no funciona y no encuentraboost::end en la expresiónend(range)? Y si es intencional, ¿cuál es la razón detrás de esto?

Para ser claros, el resultado esperado sería similar a lo que sucede eneste ejemplo utilizandostd::find_if y sin reservasend(vec).

Respuestas a la pregunta(3)

Su respuesta a la pregunta