From: Jaakko (jajarvi_at_[hidden])
Date: 2004-04-15 21:39:21
On Apr 15, 2004, at 3:21 PM, Dill, John wrote:
>> Hello John,
>> There's a big technical reason:
>> If bind would have reference semantics, you could not do this:
>> bind(f, 1, _1)
>> Bind would have to take its arguments as
>> template <class F, class A, class B, ...>
>> bind( F, A&, B&, ...)
>> 1 is a non-const rvalue, which cannot be bound to non-const reference.
> I think I almost got it now, but I'm still a little confused about
> bind_template.hpp where the list template parameters are A1&, A2&,
> A3&, ...
> list1 for example stores a template parameter A1 as "A1 a1;". So this
> ends up not actually being a reference to a normal type T, but to the
> value<T> wrapper class? If not, what type is actually A1& in the
> listN declarations in bind_template.hpp?
In bind_template.hpp you are looking at the parameter passing
conventions for the arguments to
a function object that bind has created. Those are passed by reference.
They are temporarily stored into the listN structures, or references to
those arguments are,
bind(f, _1, a)(b)
bind(f, _1, a) creates a function object which stores a copy of a,
which defines a unary
function call operator that takes its argument, b in this case, by
So e.g. list1 is always instantiated with a reference type, and thus it
also stores the arguments
Hope this helps,