Boost logo

Boost Users :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2007-04-05 13:14:02


Barchenkov, Alexei (IT) wrote:
>> The problem is that tr is ref( t ) and is interpreted by bind as a
> request to store a reference to t.
>> boost::bind( &foo< Test& >, tr ) should work, if this helps.
>
> Peter, thank you very much. Could you please clarify what you mean
> however, because my understanding was that on construction,
> boost::bind
> internally just stores a copy of the bound argument without regard to
> the signature of the function to be invoked. The conversion of the
> argument to the type appropriate to the function invocation occurs
> when the functor is actually called.

boost::bind considers a reference_wrapper a special case and unwraps it
before calling the function. Given

boost::bind( f, ref(x) )();

it will call f with a reference to x, not with the value ref(x). This causes
problems in your example because reference_wrapper's constructor is explicit
and the reference to t cannot be converted to reference_wrapper<Test>.

We've been toying with the idea of making reference_wrapper's constructor
implicit. I don't remember why we decided against it. Some subtle problems
with dangling references maybe?


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net