How to break const

deadalnix deadalnix at gmail.com
Mon Jun 18 14:04:47 PDT 2012


Le 18/06/2012 17:29, Timon Gehr a écrit :
> 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'.

Transitivity by itself is required to solve a wide range of problem. The 
most obvious one is controlling what is shared and what isn't using the 
type system.


More information about the Digitalmars-d mailing list