Dnia 08-12-2009 o 19:46:02 Michal Minich <[email protected]> napisał(a):

Discussion with Tomek Sowiński and Steven Schveighoffer moved from
digitalmars.D.learn:

Currently it is impossible to have static member function in struct or
class; this does not compile:

struct S2
{
    static void foo () immutable { }
}

Error: function main.S.foo without 'this' cannot be const/immutable

The problem I see is in definition of immutable member function:

from D specs: "Immutable member functions are guaranteed that the
object and anything referred to by the this reference is immutable." --

I think this rule is wrong, because it mentions *this* and at the same
time it applies to static member functions, which obviously doesn't have
*this* reference.

I propose changing this rule 2 to: "Immutable *non-static* member
functions are guaranteed that the object and anything referred to by the
this reference is immutable." and adding this one: "Immutable static
member functions are guaranteed that the static variables of object and
anything referred to by these variables is immutable"

And I'm asking if this is reasonable, useful, implementable and/or
desired - Or how should be defined semantics of static immutable member
function? Currently there are none.

Consider this example:

struct S
{
    static int x;

    static void foo () immutable
    {
       x = 3; // should be error, because immutable static member
function cannot change mutable static data members.
    }

    static void bar ()
    {
       x = 3; // ok
    }
}

There is already bugzilla entry: http://d.puremagic.com/issues/
show_bug.cgi?id=3598

I think immutable static member functions don't make sense and rightly so. On functions immutable is about "this" and there's no "this". Currently everything inside an immutable struct/class is tagged with "immutable". I say, tag everything but static functions. Let immutable types define them like anyone else.


Tomek

Reply via email to