
Joel de Guzman:
Alright, let's put it to a vote then. Here's my vote:
Capture expressions by value: +1 Capture special objects by ref (e.g. cout, endl, arrays): +1
This is not that different from Lambda, except that it has Capture left side of = and @= by ref: +0.5
Const propagation is less of an issue in Phoenix because it has true local variables. With boost::bind and a suitably defined f, one can do
boost::bind( f, 0, 0, _1 )
to approximate a lambda with two local variables, initially 0, and one argument.
That's a nice trick! That can be quite useful on certain occasions.
If you manage to include both Phoenix and boost::bind, you can do a generator function that returns 1, 2, 3... with: boost::bind<int>( ++arg1, 0 ) Of course if you have Phoenix you should be able to do the same with lambda( _a = 0 )[ ++_a ] but it doesn't seem to work. Maybe I'm doing something wrong. :-)
Phoenix doesn't need such tricks. But the question needs to be considered, and a balance has to be struck.
What do you think would be a good balance?
I'm not sure yet. I like the const propagation feature of boost::bind, but I can't say how it'd work in the larger Phoenix context, and whether it wouldn't prove too error-prone for casual use.