How to break const

deadalnix deadalnix at gmail.com
Tue Jun 19 00:59:19 PDT 2012


Le 19/06/2012 00:16, Artur Skawina a écrit :
> On 06/18/12 23:08, deadalnix wrote:
>> Le 18/06/2012 09:14, Mehrdad a écrit :
>>> Okay, how about this? http://ideone.com/VMlzS
>>>
>>> Does this break const?
>>>
>>>
>>> import std.stdio;
>>> class S
>>> {
>>> this(int a)
>>> {
>>> this.a = a;
>>> this.increment = { this.a++; };
>>> }
>>> int a;
>>> void delegate() increment;
>>> void oops() const { this.increment(); }
>>> }
>>> void main()
>>> {
>>> auto c = new const(S)(0);
>>> writeln(c.a);
>>> c.oops();
>>> writeln(c.a);
>>> }
>>
>> Depending on how it is specified, I think you should either :
>>   - get an error when constructing c, because S isn't « constable ». (delegate type cannot be consted, but can be unconsted safely).
>>   - get an error when you try to call increment in oops, because the delegate type can't ensure the constness of the operation.
>>
>
> I'm afraid that:
>
> - Banning implicit mutable->const conversions would do far more harm,
>    so this would not be a good solution to the problem.
> - Requiring that the type of the delegate "ensure the constness" would
>    be far too restrictive. (the question would be: "Is any data reachable
>    via 'this' also reachable through the delegates context pointer?" and
>    every such delegate would of course need to be "pure" [1].
>
> [This isn't *just* about the above example, you get the same problems
>   when a const object isn't created but received from somewhere.]
>
> artur
>
> [1] which is a misnomer.

Due to D concept of weak purity, this doesn't ensure the required what 
we need here.

It is possible to get the error when trying to call the delegate instead 
of preventing to make it const, as I said in the post you quote. It is 
probably a better solution.


More information about the Digitalmars-d mailing list