If that is the case, why wasn't ADL limited to operators instead of all functions?
Why limit it artificially? ADL may be tricky to implement (when combined with C++’ overloading rules)1 but it’s an extremely useful technique. For one thing, the fact that it also works on functions makes it much easier to use other namespaces without importing the whole namespace.
Case in point, the SeqAn library:
using seqan::String;
String<Char> url = "http://www.seqan.de/";
std::cout << "The URL " << url << " has length " << length(url) << std::endl;
Notice that I’ve used the function seqan::length
without qualifying its full name. ADL finds it anyway. The SeqAn library uses such namespace-scope functions excessively and prefixing every usage with the namespace name would be impractical. Likewise, importing the namespace often isn’t advisable.
The same is of course true for many other libraries, such as most of Boost’s.
1 And I believe that this wasn’t immediately realized by the committee.