How do "pure" member functions work?
Timon Gehr
timon.gehr at gmx.ch
Sat Aug 20 09:43:29 PDT 2011
On 08/20/2011 06:24 PM, Sean Eskapp wrote:
> == Quote from David Nadlinger (see at klickverbot.at)'s article
>> On 8/20/11 5:13 PM, Sean Eskapp wrote:
>>> Does marking a member function as pure mean that it will return the same
>>> result given the same parameters, or that it will give the same result, given
>>> the same parameters and given the same class/struct members?
>> The second one, the implicit this parameter is just considered a normal
>> argument as far as purity is concerned.
>> David
>
> Wait, references and pointers are now valid for pure function arguments?
There are different forms of pure functions:
weakly pure:
no mutable globals are read or written. the function may however change
its arguments. weakly pure functions are useful mainly for the
implementation of functions with stronger purity guarantees.
const pure/strongly pure:
All function arguments are values or const/immutable.
From the type signature of a function, you can always tell which form
of pure function it is:
int foo(ref int, int) pure; // weakly pure, could change first argument
int bar(const(int)*, int) pure; // const pure
int qux(immutable(int)*, int) pure; // strongly pure
Weakly pure member functions can therefore change the other members:
struct S{
int x;
int foo() pure; // weakly pure, could change x
int bar() pure const; // const pure, cannot change x
int qux() pure immutable; // strongly pure, only works with
immutable instances
}
The rationale of this:
Consider
int baz(int x) pure{
S s=S(x);
S.foo();
return s;
}
This is clearly strongly pure code. If we had no weakly pure, this could
not be written in that way.
More information about the Digitalmars-d-learn
mailing list