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.

Reply via email to