Boost logo

Boost :

Subject: [boost] [range] adaptors vs. rvalue to lvalue& binding
From: Arno Schödl (aschoedl_at_[hidden])
Date: 2012-03-22 02:40:02


Hello,

ideally I would like to use range-adapted lvalue ranges like any other lvalue ranges. Writing it down naively, as below, does not compile because LoadRefRange takes (and should take?) the range it modifies by lvalue&, while adaptor expressions are rvalues.

template<typename Range>
void modifies_range( Range& rng );

A a[5];

main() {
      // modifies all elements of a
        modifies_range ( a );
       
      // modifies all elements (except for one) of a
        // adaptor is rvalue, does not compile:
      modifies_range (
                boost::range::join(
                        boost::adaptors::slice( a, 0, 1 ),
                        boost::adaptors::slice( a, 2, countof(a) )
                )
      );

        // compiles, but ugly:
        auto rng=boost::range::join(
                boost::adaptors::slice( a, 0, 1 ),
                boost::adaptors::slice( a, 2, countof(a) )
        );
        modifies_range(rng);
}

Any thoughts? Should adaptors receiving lvalues offer an

        operator adaptor&() &&; // overload on rvalue-ness

so they are passing through the lvalue or their argument? A suitable baseclass a la boost::additive could do that.

Regards,

Arno

--
Dr. Arno Schödl | aschoedl_at_[hidden]
Technical Director
think-cell Software GmbH | Chausseestr. 8/E | 10115 Berlin | Germany
http://www.think-cell.com | phone +49 30 666473-10 | US phone +1 800 891 8091
Amtsgericht Berlin-Charlottenburg, HRB 85229 | European Union VAT Id DE813474306
Directors: Dr. Markus Hannebauer, Dr. Arno Schoedl

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