Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2006-06-20 08:50:40


"Peter Dimov" <pdimov_at_[hidden]> writes:

> Ken MacKay wrote:
>> I found that I can use bind without specifying the boost namespace
>> when a placeholder (eg, _1) is used. If I don't use a placeholder in
>> the bind expression, then the compiler properly complains that "bind"
>> is undeclared. I am using gcc 3.3.5 on QNX 6.3.2.
>>
>> Example program (compiles, but it shouldn't):
>>
>> #include <boost/function.hpp>
>> #include <boost/bind.hpp>
>>
>> void something(int i, int j)
>> {
>> }
>>
>> int main()
>> {
>> boost::function<void (int)> f = bind(&something, 0, _1);
>> return 0;
>> }
>
> This behavior is caused by a C++ rule known as argument-dependent lookup
> (ADL) or Koenig lookup.

In other words, it's not a bug.

> In an expression of the form f(x, y), f is (also)
> looked up in the ("associated") namespaces of x and y. Since _1 is usually
> of type boost::arg<1>, boost is an associated namespace for it and the
> function "bind" is found without an explicit boost:: qualification.

Depending on your point of view, this might be an argument for moving
the placeholders into a nested namespace (with a using directive to
bring them out, of course).

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk