Subject: Re: [boost] [Range] Range adaptor approach for temporary range lifetime issue
From: Michel Morin (mimomorin_at_[hidden])
Date: 2012-06-17 18:11:33
Dave Abrahams wrote:
>> Side note:
>> * There is also a fully automatic approach (i.e. when an rvalue range
>> is adapted,
>> `moved_range` is automatically used without piping it to `moved` adaptor).
>> But this approach incurs unnecessary overhead when passing them to functions,
>> because function arguments do not have the lifetime issue and we don't need
>> to use `moved_range`. So I prefer the "manual" approach.
> Could you illustrate this with an example? I'd like to understand the
> trade-off you're making.
Here is an example of the manual approach:
template <typename Range> void f(Range&&);
// No lifetime problem.
f(std::string("Hello world!") | reversed);
// `moved` is not necessary.
f(std::string("Hello world!") | moved | reversed);
In the automatic approach, `std::string("Hello world!") | reversed` returns
`moved_range<std::string, boost::fusion::vector<reverse_forwarder> >`.
So there is unavoidable overhead (i.e. moving a temporary container
into range adaptors) in `f(std::string("Hello world!") | reversed);`.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk