
Niall Douglas wrote:
In AFIO I was not surprised by shared_ptr, but I was quite surprised by my use of boost::bind => std::bind which did not convert over identically. The fix was trivial, but I still learned I had been sloppy.
There are enough subtle (and pretty much intentional) differences between boost::bind and std::bind that the two aren't interchangeable. In the past, when C++11 was the future, I've sometimes said that in a C++11 Boost boost/bind.hpp will just contain namespace boost { using std::bind; }, but it can't. This will break a ton of code. For instance, given these two functions: void f( int x ) { std::cout << "f(" << x << ")\n"; } void f( int x, int y ) { std::cout << "f(" << x << ", " << y << ")\n"; } then boost::bind( f, 1 )(); works, and std::bind( f, 1 )(); doesn't. Conversely, for most std::bind implementations, this std::bind<void(int)>( f, 1 )(); works (saving you a cast), but the Boost equivalent boost::bind<void(int)>( f, 1 )(); doesn't. In addition, boost::bind supports a few operators, and std::bind doesn't (although one might argue that it ought to, as it already contains the necessary plumbing, but given that C++11 has lambdas, nobody decided to bother.) Even boost::mem_fn is not completely superseded by std::mem_fn. boost::mem_fn does get_pointer(sp)->f(...) for smart pointers, whereas std::mem_fn does (*sp).f(...). For most people this doesn't make much difference, but there are tricks you could play with get_pointer that would be broken.