Fully transitive const is not necessary
Steven Schveighoffer
schveiguy at yahoo.com
Wed Apr 2 07:24:14 PDT 2008
"Janice Caron" wrote
> On 02/04/2008, Steven Schveighoffer wrote:
>> "Janice Caron" wrote
>> > pure requires transitive const.
>>
>> Forgive me if I don't take your word for it. Please prove this.
>> Specifically, why pure fails with logical const (not head const as C++
>> is).
>
> class Stupid
> {
> int x;
> mutable int y;
> }
>
> not_pure void f(const(Stupid) stupid) const
> {
> int t = y;
> ++t;
> y = t;
> }
>
> Try calling f from two threads at the same time, imagine a thread
> switch partway through f.
I'm assuming you meant f to be part of Stupid? And that not_pure means that
you are trying to make f pure, but this is your comment that it doesn't
work?
This would not compile under the rules I specified. Note the rules:
- a pure function can only access local variables (I'm going to ammend this
to say local variables and globally invariant variables).
- all parameters to a pure function must be logically invariant
- a pure function can only call pure functions or methods.
- a pure method cannot access the mutable portion of a logically invariant
data value.
Your code violates rules 2 and 4.
-Steve
More information about the Digitalmars-d
mailing list