How to break const

deadalnix deadalnix at gmail.com
Mon Jun 18 05:45:19 PDT 2012


Le 18/06/2012 07:59, Matthias Walter 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.
>
> Matthias

The hidden parameter of the delegate is stored in c. This hidden 
parameter must be qualified with const when c is made const, for 
transitivity. However, it isn't.

In short :
- c is made const
- the frame pointer is stored in c
- the frame pointer must be made const for transitivity.

=> The type system is broken. You'll find many examples of this behavior 
with delegates.


More information about the Digitalmars-d mailing list