Por que o ADL não está funcionando com o 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));
}

Demonstração ao vivo Clang Demonstração ao vivo do GCC

isto dá:

main.cpp: 8: 37: erro: uso do identificador não declarado 'final'

Considerando que se você escreverusing boost::end; istofunciona muito bem, o que implica queboost::end é visível:

Por que a ADL não está funcionando e está encontrandoboost::end na expressãoend(range)? E se for intencional, qual é a lógica por trás disso?

Para ficar claro, o resultado esperado seria semelhante ao que acontece emeste exemplo usandostd::find_if e não qualificadoend(vec).

questionAnswers(3)

yourAnswerToTheQuestion