Boost logo

Boost :

Subject: Re: [boost] [GSoC][Phoenix3] Regarding mutability of arguments passed to phoenix expressions
From: Stewart, Robert (Robert.Stewart_at_[hidden])
Date: 2010-04-30 07:17:36


Thomas Heller wrote:
> 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:
>
> > > >> 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;
> }

Why not pass the container by reference to const? You could even use Boost.CallTraits to manage by value versus reference to const.

> 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 );

The suggestion was that the latter could be handled by explicitly making _1 pass by reference to non-const using ref() or something. Thus, if writing code like you've shown is a performance problem, write the impure version using ref().

_____
Rob Stewart robert.stewart_at_[hidden]
Software Engineer, Core Software using std::disclaimer;
Susquehanna International Group, LLP http://www.sig.com

IMPORTANT: The information contained in this email and/or its attachments is confidential. If you are not the intended recipient, please notify the sender immediately by reply and immediately delete this message and all its attachments. Any review, use, reproduction, disclosure or dissemination of this message or any attachment by an unintended recipient is strictly prohibited. Neither this message nor any attachment is intended as or should be construed as an offer, solicitation or recommendation to buy or sell any security or other financial instrument. Neither the sender, his or her employer nor any of their respective affiliates makes any warranties as to the completeness or accuracy of any of the information contained herein or that this message or any of its attachments is free of viruses.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk