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