On 06/18/2012 05:14 PM, Christophe Travert wrote:
Matthias Walter , dans le message (digitalmars.D:170036), a écrit :
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.

But here, the frame pointer of the delegate is part of the const
structure. By transitivity, the frame pointer should be const, ...

'By transitivity' is not a sufficient reason. What you really mean is
'For the guarantee that a const pure method does not change its mutable
parameters'.

Reply via email to