
On Wednesday 28 April 2010 19:43:43 Stewart, Robert wrote:
Eric Niebler wrote:
On 4/28/2010 10:19 AM, Mathias Gaunard wrote:
Thomas Heller wrote:
Regarding arguments to phoenix expressions there are two possibilities. The first is: Arguments are mutable. The current phoenix is implemented to be able to this.
We now have lambdas in C++0x. IMO, we should be paying attention to the default semantics of lambdas which, IIRC, accept their arguments by value(?), and have special syntax for accepting their arguments by reference. Someone should correct me if I got that backwards. In the
The introducer uses & before names to get references. By value is the default.
long haul, I think this will satisfy the Principle of Least Surprise.
giving that pure functional phoenix stuff a little more thought. Consider the following code (Reminder, this is just an example): template< typename Container > Container & push_back_impure( Container & c, typename Container::value_type const & v ) { c.push_back( v ); return c; } template< typename Container > Container push_back_pure( Container c, typename Container::value_type const & v ) { c.push_back( v ); return c; } int main() { std::vector<int> v; // this could be equivalent to a phoenix expression like // ( phoenix::push_back( phoenix::_1, 4 ) )( v ); push_back_impure( v, 4 ); // whereas this needs to be written as (to get the same effect): // v = ( phoenix::push_back( phoenix::_1, 5 ) )( v ); // looks like a performance hog v = push_back_pure( v, 5 ); } I think both versions have a some valid use cases. However I would like to postpone that discussion until I have working version of the new phoenix. Joel, could you elaborate why you implemented the current phoenix version as it is?