C++0x lambdas are monomorphic, while bind can be polymorphic. You cannot have something like
auto f = [](auto a, auto b) { cout << a << ' ' << b; }
f("test", 1.2f);
a and b must have known types. On the other hand, tr1/boost/phoenix/lambda bind allows you to do this:
struct foo
{
typedef void result_type;
template < typename A, typename B >
void operator()(A a, B b)
{
cout << a << ' ' << b;
}
};
auto f = bind(foo(), _1, _2);
f("test", 1.2f); // will print "test 1.2"
Note that the types A and B are not fixed here. Only when f is actually used these two will be deduced.