Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2005-09-03 12:13:19

David Abrahams wrote:
> Thorsten Ottosen <nesotto_at_[hidden]> writes:
>>>You also seem to be forgetting the Range concepts that you yourself
>>>documented here: 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.


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

Boost list run by bdawes at, gregod at, cpdaniel at, john at