Boost logo

Boost :

From: Rani Sharoni (rani_sharoni_at_[hidden])
Date: 2004-02-11 15:15:02


David Abrahams wrote:
> "Rani Sharoni" <rani_sharoni_at_[hidden]> writes:
>> [...]
> So you're basically saying that in my suggested text:
> "A temporary of type ``cv1 T2'' [sic] is constructed using direct
> initialization from the rvalue object. The reference is bound to
> the temporary or to a sub-object within the temporary"
>
> the mention of direct initialization is pointless and could be
> written :
>
> "A temporary of type ``cv1 T2'' [sic] is initialized from the
> rvalue object. The reference is bound to the temporary or to a
> sub-object within the temporary"
>
> ??
>
> I think the text has to account for the possibility that the
> constructor used might be explicit, doesn't it?

This is true but explicit copy (or copying) constructor is quite useless
(unless someone will find a way to abuse it for good purpose).

Raoul Gough and I have tried to relax this surprising reference binding
limitation (i.e. requires copying constroctor) for the favor of wider range
of cases (e.g. private copy constructor). The suggestion basically says that
*direct reference binding* is enough for most cases of class rvalue
bindings.
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_active.html#391

>> IMO your suggestion is fully compliant and EDG has bug that confuses
>> everyone.
>>
>> I don't have anything else to add to this discussion.

Maybe some more.

> Sorry to draw it out, but I don't understand when you say "suggestion"
> whether you're referring to my suggested text change or the movable
> class idiom I posted.

The later.
For the moveable class Idiom you don't need to revise the standard text
since Steve Adamczyk already did that ~7 years ago when he removed the copy
constructor requirement.
You only encountered a bug in EDG which is also inconsistent:

struct A {
// private:
    template<typename T>
    A(T const& r) {
        int const* p = &r; // error if T != int -> error if T == A
        p = p;
    }

private:
    A(A&);
};

int f(A const&);

// template constructor is
// enough for the "illusive coping"
int x = f(A(10)); // compiled fine using EDG and GCC

Making the template *converting* constructor private will trigger access
error for both EDG and GCC although they don't actually call it.
VC rejected this code and has open bug for this issue.

Again DR #391: <Q> J. Stephen Adamczyk replied that the reason for changing
"a copy constructor" to "a constructor" was to allow for member template
*converting* constructors.</Q>

In your moveable implementation the converting constructor (i.e. X(ref)) is
as good as template converting constructor from overloading pov which makes
your code *fully compliant* within the current standard text. Cheers!

>> No alarms and not surprises silence.
>
> Wow, parse error again. Radiohead?

Right, I'm a loyal fan.

Regards,
Rani


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