On 7/9/20 6:08 PM, psycha0s wrote:
import std.stdio;

struct Foo {
     int value;

     this(int n)
     {
         value = n;
         writeln("constuctor ", &this);
     }

     ~this()
     {
         writeln("destuctor ", &this);
     }

     this(ref return scope Foo other)
     {
         value = other.value;
         writeln("copy constuctor ", &this);
     }
}

void main()
{
     writeln("begin");
     auto foo1 = Foo(1);
     auto foo2 = foo1;
     writeln("---");
     foo2 = foo1;
     writeln("===");
     writeln("end");
}

Looking at the generated AST, it's because the compiler is adding an auto-generated opAssign, which accepts a Foo by value. It is that object that is being created and destroyed. Your objects aren't moving.

Here is what AST looks like for main:

void main()
{
        writeln("begin");
        Foo foo1 = foo1 = 0 , foo1.this(1);
        try
        {
                Foo foo2 = foo2 = 0 , foo2.this(foo1);
                try
                {
                        writeln("---");
foo2.opAssign(((Foo __copytmp434 = __copytmp434 = 0 , __copytmp434.this(foo1);) , __copytmp434));
                        writeln("===");
                        writeln("end");
                }
                finally
                        foo2.~this();
        }
        finally
                foo1.~this();
        return 0;
}

-Steve

Reply via email to