
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, in 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 reference. So e.g. list1 is always instantiated with a reference type, and thus it also stores the arguments as references. Hope this helps, Jaakko