On Mon, Apr 02, 2018 at 10:26:32AM +0000, RazvanN via Digitalmars-d-learn wrote: > Hi all, > > Let's say we have this code: > > struct B > { > int a; > this(int a) immutable > { > this.a = 7; > } > > this(int a) > { > this.a = 10; > } > } > > void main() > { > B a = immutable B(2); > writeln(a.a); > a.a = 4; > > immutable B a2 = immutable B(3); > writeln(a2.a); > a2.a = 3; // error : cannot modify > } > > Both a and a2 will be constructed using the immutable constructor, > however a is not immutable (a.a = 4 will compile fine). Is this the > intended behavior? > Shouldn't the compiler warn me that I'm trying to create a mutable > object using the constructor for an immutable object? I couldn't find > any documentation about this.
What's happening here is that B is a value type, meaning that assignment makes a copy of the object. Since B has no fields that contain indirections, when a copy of B is made, it is completely independent of the original immutable object, so it's perfectly fine to make the copy mutable. T -- Meat: euphemism for dead animal. -- Flora