On Thursday, 23 May 2013 at 11:31:19 UTC, Simen Kjaeraas wrote:
On Thu, 23 May 2013 13:29:49 +0200, Namespace <rswhi...@googlemail.com> wrote:

That was what I also expected. But opAssign is not called.

Because you have a postblit. It's called instead of opAssign.

[code]
import std.stdio;
import std.c.string : memcpy;

struct A {
public:
        int id;

        this(int id) {
                writeln("CTor ", id);

                this.id = id;
        }

        this(this) {
                writeln("Postblit ", this.id);

                this.id *= 2;
        }

        void opAssign(ref const A a) {
                writeln("opAssign L: ", a.id);
                this.id = a.id;
        }

        void opAssign(const A a) {
                writeln("opAssign R ", a.id);
                memcpy(&this, &a, A.sizeof);
        }

        ~this() {
                writeln("DTor ", this.id);
        }
}

class B {
private:
        A _a;

public:
        this() {
                this._a = A(42);
        }

        ref A getA() {
                writeln("Return A");
                return this._a;
        }
}

void main() {
        B b = new B();
        A a = b.getA();
}
[/code]

Output:
----
CTor 42
opAssign R 42
DTor 42
Return A
Postblit 42
DTor 84
DTor 42
----

Postblit, no opAssign call.

Reply via email to