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