
David Abrahams wrote:
Thorsten Ottosen <nesotto@cs.aau.dk> writes:
You also seem to be forgetting the Range concepts that you yourself documented here: http://boost.org/libs/range/doc/range.html. In the concepts, the calls to begin()/end() are REQUIRED to be qualified.
Let me clarify. Eric, you seem to be saying that it's inconsistent for the "begin" extension mechanism to be "add a begin to be found via ADL in the same namespace as the Range type" and for the interface for calling those begin to be "boost::begin(x)." There's no inherent inconsistency there. It's possible to implement such a mechanism.
*blink* It is? If boost::begin() makes an unqualified call to begin(), then wouldn't it just end up recursing forever? You must have some subtlety in mind that is eluding me. <thinking...> Oh, wait. Are you referring to something like this: namespace super_private { template<typename T> some-return-type begin_impl(T &t) { return begin(t); } } namespace boost { template<typename T> some-return-type begin(T &t) { return super_private::begin_impl(t); } } The unqualified call to begin() in namespace super_private will not find the one in namespace boost, hence no infinite recursion. But this doesn't quite work because if type T has boost as an associated namespace, it *will* consider the begin() in namespace boost, and we're back to infinite recursion. Regardless, it was gcc's interpretation of name-lookup that put the kibosh on unqualified calls to begin() and end(). -- Eric Niebler Boost Consulting www.boost-consulting.com