Warum funktioniert ADL nicht mit Boost.Range?

In Anbetracht

#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));
}

Live Clang Demo Live GCC Demo

das gibt

main.cpp: 8: 37: Fehler: Verwendung des nicht deklarierten Bezeichners 'end'

Bedenken Sie, dass, wenn Sie @ schreibusing boost::end; itworks ganz gut, was bedeutet, dassboost::end ist sichtbar

Warum funktioniert ADL nicht und findetboost::end im Ausdruckend(range)? Und wenn es beabsichtigt ist, was ist das Grundprinzip dahinter?

Um klar zu sein, würde das erwartete Ergebnis dem in @ ähneldieses Beispiel usingstd::find_if und unqualifiziertend(vec).

Antworten auf die Frage(6)

Ihre Antwort auf die Frage