AMDG On 04/06/2011 09:03 PM, Eric Niebler wrote:
On 4/7/2011 1:02 AM, Steven Watanabe wrote:
On 04/06/2011 10:46 AM, Peter Dimov wrote:
Eric Niebler wrote:
I'm saying that boost::function should actually be defined in boost::function_adl_block and be imported into the boost namespace with a using declaration.
This makes no sense to me. boost::bind is the unconstrained function template found by ADL, not boost::function. You ought to be arguing that boost::bind should be in an ADL-blocking namespace. Of course this will break all code that relies on ADL to omit the boost:: qualification.
The problem is that it's much easier to put a class in an ADL blocking namespace, than to put a class in al ADL blocking namespace:
Huh?
Oops. That should be "it's much easier to put a class in an ADL blocking namespace, than to put a /function/ in an ADL blocking namespace"
namespace bind_adl_block { template<class F> void bind(F f); } using bind_adl_block::bind; // bind can still be found by ADL
The only way to do it is with a using directive:
using namespace bin_adl_block;
but this is fragile for other reasons.
Wow, it seems there's a lot I don't know. Isn't this allowed:
using bind_adl_block::bind;
It's allowed, but it doesn't work, because a function imported via a using declaration /can/ be found by ADL.
And what is wrong with leaving bind in the boost namespace as I was suggesting and define boost::function like this:
namespace boost { namespace function_adl_block { template<class Sig> struct function {...}; } using function_adl_block::function; }
Now the "boost" namespace is no longer associated with boost::function, and boost::bind won't be found by ADL. Unless I'm mistaken, and a quick test with comeauonline suggests I'm not. But Steven and Peter are usually right about this stuff, so I'll patiently wait to be corrected and learn. :-)
Yes, you're correct about this. In Christ, Steven Watanabe