Chris Stankevitz wrote:
Can someone please explain why a cref is needed in the last line of
the attached code snippet?
void f()
{
//bind(b, bind(a));//*1
bind(b, cref(bind(a)));//*2
}
Line *1 isn't doing the same thing as *2 -- see the documentation on nested binds [1].
In short, *1 is evaluating a() (which returns void), then attempting to pass that into the outer bind. I'm not sure if cref is an acceptable call to use there -- I don't know if it would always work. It would be more idiomatic to use protect:
bind(b, boost::protect(bind(a)))
All assuming that your actually case is more complicated than shown here, and can't be replaced with:
bind(b, a);
HTH,
Nate
[1]