
"Peter Dimov" <pdimov@mmltd.net> 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