Under Visual Studio C++ 2013 the example works fine after adding a reference in function signature:
boost::function<bool(boost::shared_ptr<const Boom>&)>

This somehow prevents too much forwarding and losing the original value

2016-06-17 1:29 GMT+02:00 Gavin Lambert <gavinl@compacsort.com>:
On 17/06/2016 09:39, Jason Mancini wrote:
So this snippet comes from a sizable code base.  Took a long time to
pinpoint then distill the issue down to the 6-line example!  Pretty sure
that std::bind / std::function don't support this usage, or at least it
didn't work when I tried for a few minutes.  Boost flavor seems a bit
more featured.

Yeah, boost::bind supports quite a few late-binding operators, which are handy to improve code brevity but can be a bit confusing to read.  If you're using a C++11 compiler then it's probably better to use lambdas for these cases now.

The actual offender is the bigger change in bind/bind.hpp from 1.59 to
1.60 (not the trivial changes in args or placeholder).  I can see they
added significant std::forward / rvalue support.  If I set
BOOST_NO_CXX11_RVALUE_REFERENCES then also it continues to work.  I
suspect we've hit a corner case issue with forward / rvalue and
boost::function / boost::shared_ptr.

Most likely, somewhere along the way it's moving the pointer and then returning the original instead of the new one.

Boost-users mailing list