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.
