On 02/16/2012 09:35 AM, Walter Bright wrote:
These all need to be:
const pure nothrow @safe
Unless this is done, the utility of const, pure, nothrow and @safe is
rather crippled.
Any reason why they shouldn't be?
The utility of const, pure, nothrow and @safe is already rather crippled
when using Phobos. It is a rather small minority of my pure functions
that are effectively annotated pure, because most of Phobos is not
properly annotated and the inference for templates does not work
satisfactorily yet.
So imo, making opEquals, opCmp, toHash const pure nothrow @safe is
blocked by properly annotating Phobos as well as the following issues:
Bugs in existing attribute inference:
http://d.puremagic.com/issues/show_bug.cgi?id=7205
http://d.puremagic.com/issues/show_bug.cgi?id=7511
Enhancement required for making templates const correct:
http://d.puremagic.com/issues/show_bug.cgi?id=7521
One reason is memoization, aka lazy initialization, aka logical const. I
don't believe these are worth it. If you must do it inside those
functions (and functions that override them), you're on your own to make
it work right (use unsafe casts, etc.).
It would be helpful if we could add cast(pure) for that purpose. The
documentation could state that cast(pure) is only valid if the behaviour
of the enclosing function still appears to be pure.