Consider the following:

class A
{
    int x;
}

class B
{
A a = new A; // I would expect this to be called for each "new B".
}

void main()
{
    import std.stdio;

    auto c = new B;
    writeln("c ", c.a.x);
    c.a.x++;
    writeln("c ", c.a.x);
    writeln;

    auto d = new B;
    writeln("d ", d.a.x, " expected 0!");
    d.a.x++;
    writeln("d ", d.a.x, " expected 1!");
}

*** Output ***
c 0
c 1

d 1 expected 0!
d 2 expected 1!

There is only one instance of A in the above program, although I would expect one for each instance of B. The field is not marked static.

Is this intended? My gut reaction is the compiler is memoising "new A" because purity is inferred, but doesn't that contradict the meaning of "new Class" which should always yield an object with it's own identity?

I can fix using a dedicated constructor, but I much prefer initializers where possible.

Reply via email to