Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2004-04-16 08:27:02


"Andrea Torsello" <torsello_at_[hidden]> writes:

> Hi, I have been investigating move semantics and think that I came up with a
> solution that is strongly influenced by both David Abrahams' move approach
> and Andrei Alexandrescu's mojo, but solves some of the problems I have
> encountered with them.
> The basic idea is to use the explicit keyword to force the compiler to use
> the X(X const &) constructor only in two cases.
> 1) When explicitly copying a const object i.e.
> X const x;
> X y(x); //use explicit copy constructor

Not when passing a non-const lvalue?

    X x;
    X y(x); // implicitly uses a move ctor?? That's highly undesirable!

> 2) When passing by const ref
> void f(X const &);
> X makeX();
> void foo()
> {
> f(makeX()); //use explicit copy constructor
> }
> In all other cases the other constructor take precedence.

Which "other constructor"?

> Note that the template trick David Abrahams uses in his move
> approach would lead to an error on a conforming compiler when
> confronted with case #2 (unless more recent versions corrected
> this).

I'm not sure what you mean, but AFAICT case #2 is handled just fine by
conforming compilers. Did you read
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2004/n1610.html?
It's a question of interpretation of a particular clause of the
standard.

> I chose to keep the temporary and constant subtypes from mojo because they
> allow me to discriminate between const values, non-const rvalues and
> non-const rvalues.

const and non-const rvalues are pretty much interchangeable, since the
compiler can turn the former into the latter. If they weren't
interchangeable, I don't see any reason you'd want to treat a const
rvalue differently from a const lvalue.

> The lack of this capability was the major problem I had with David
> Abrahams' move.

Why?

> My use-case was a vector-like container that increases but never
> decreases the size of its backing store. In order to provide the
> never decreasing backing-store semantic, operator = moves the
> backing store from a temporary only if the new data does not fit in
> the existing space. Hence, operator = must be able to discriminate
> between temporaries and non-temporaries.

My solution allows discrimination between temporaries and
non-temporaries.

> My solution fullfills almost all the requirements I had:
> 1) passing by value moves non-const rvalues and copies everithing else.
> 2) its is transparent to the user of the class.
> Alexandrescu's Mojo fails this because of the special return type, while
> Abrahams' move fails it because of the pass-by-const-ref problem described
> above.

Please describe the problem in more detail.

> 3) it allows to discriminate between constants, non-const lvalues, and
> non-const rvalues.
> Alexandrescu's Mojo allows it, while Abrahams' move does not.

Why is that an advantage?

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

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