$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Peter Dimov (pdimov_at_[hidden])
Date: 2002-10-16 10:25:38
From: "Kevin S. Van Horn" <Kevin.VanHorn_at_[hidden]>
> A Mojo-enabled class X has ctors
>
> X(X&);
> X(mojo::constant<X>);
> X(mojo::temporary<X>);
>
> but does NOT have a ctor
>
> X(X const &);
>
> Now, section 12.8, paragraph 1 of the Standard states
>
> "A class object can be copied in two ways, by initialization (12.1, 8.5),
> including for function argument passing (5.2.2) and for function value
> return (6.6.3), and by assignment (5.17). Conceptually, THESE TWO
> OPERATIONS ARE IMPLEMENTED BY A COPY CONSTRUCTOR (12.1) and COPY
> ASSIGNMENT OPERATOR (13.5.3)."
>
> (Emphasis added.) Section 12.1, paragraph 10 defines a copy ctor:
>
> "A copy constructor for a class X is a constructor with a first parameter
> of type X& or of type const X&."
>
> This implies that to return an rvalue of type X from a function, or to
> pass an rvalue as a function argument that is to be of type X, a
> constructor X(const X&) must exist and be accessible, since a copy ctor us
> used to return or pass the arguments, this ctor must take X& or X const &,
> and the X& form cannot be used with temporaries.
>
> But mojo-enabled classes don't have X const & ctors. Oops.
>
> But neither does auto_ptr<T>! So either there's a flaw in my reasoning,
> or there's a flaw in the Standard.
This is a truck-sized loophole in the standard. The presence of an X(X&)
copy constructor enables pass and return by value, even if that constructor
is not being used.