Copy elision by spec
Jakob Ovrum
jakobovrum at gmail.com
Mon Nov 4 01:42:52 PST 2013
On Monday, 4 November 2013 at 07:02:26 UTC, Lars T. Kyllingstad
wrote:
> I was quite surprised to see that the following program
> compiles just fine with DMD:
>
> struct S
> {
> @disable this(this);
> int n;
> }
>
> S createS(int i)
> {
> S s;
> s.n = i;
> return s;
> }
>
> void main(string[] args)
> {
> auto foo = createS(1);
> foo = createS(2);
> }
>
> I already knew that the compiler was allowed to elide copies on
> return from functions, but I thought this was an optimisation,
> and not part of the language proper. I would have expected the
> compiler to complain that createS() can't return an S since S's
> postblit constructor is disabled.
>
> My question is therefore, is this by design? Can I rely on
> this to work in the future, and on all compilers? If this is
> the case, it really should be added to the spec. (Or maybe
> it's there already, but I couldn't find it.)
>
> Lars
My understanding is that your example illustrates a *move*, not a
*copy*. AFAICT, non-copyable structs would be next to useless if
we couldn't move them.
More information about the Digitalmars-d
mailing list