On Wednesday, 12 November 2014 at 19:25:49 UTC, John McFarlane wrote:
That makes sense. In the case that `c` is a class, do you think I'd have any luck if I made it immutable?
The quick answer is that it doesn't help. DMD still doesn't like me using insertInPlace. This is a little disappointing as immutable is supposed to avoid the need for copying. Then again, I guess that's a compiler - not language - level affordance. Thanks again.

Consider this code:
    void main() {
        import std.range;
        class C { string name; this(string n) { name = n; }}
        struct S { C c; }

        S a = S(new C("a"));
        S b = S(new C("b"));

        auto pC = &b.c;
        b = a;

        assert(pC.name == "a");
        assert(b.c.name == "a");
    }

I have removed the compiler guarantee of not modifying c. What you'll notice here is that I've taken a pointer to a memory location in your struct after assigning to the struct that memory location has been modified to reflect the new class object.

Had the compiler allowed this with the immutable c, by not performing a copy, then the assert would have failed which makes no sense as you wanted to store 'a' in that memory location.

Reply via email to