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

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