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