On 06/18/2012 08:04 AM, Mehrdad wrote: > On Monday, 18 June 2012 at 06:00:11 UTC, Matthias Walter wrote: >> On 06/18/2012 07:36 AM, Mehrdad wrote: >>> Is it just me, or did I subvert the type system here? >>> >>> >>> import std.stdio; >>> >>> struct Const >>> { >>> this(void delegate() increment) >>> { this.increment = increment; } >>> int a; >>> void delegate() increment; >>> void oops() const { this.increment(); } >>> } >>> >>> void main() >>> { >>> Const c; >>> c = Const({ c.a++; }); >>> writeln(c.a); >>> c.oops(); >>> writeln(c.a); >>> } >>> >> >> I don't think so. When calling oops you have two references to the >> object c: >> >> - The this-pointer of the object itself which is not allowed to change >> the object in the const-call. >> - The reference from within main which is allowed to change it and can >> be reached via the frame pointer of the delegate. >> >> I see this as perfectly valid code. Of course, opinions may differ here. >> >> Matthias > > > > My trouble isn't with the delegate, it's with the const method. > > It's with the idea that "you can tell something about the code just by > looking at it". > > The way I understood it, you can assume that a `const` method cannot > modify an object, but... that doesn't seem to be the case here. > > What am I misunderstanding?
Its not, that a const method cannot modify an object, it just ensures that the const method cannot modify the object *by using the this-pointer*. Other things cannot be ensured with const: For example, a const method could wake up a 2nd thread and proceed with a longer computation. Then this 2nd thread may have a reference to the object and may change it while your computation is going on.