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.