How to break const

Matthias Walter xammy at xammy.homelinux.net
Sun Jun 17 22:59:47 PDT 2012


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


More information about the Digitalmars-d mailing list