An interesting consequence of safety requirements

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Nov 4 09:24:33 PST 2009


Something just dawned on me: in safe mode, struct static member 
functions will be preferred to struct non-static member functions.

Why?

Consider:

struct List(T) {
     T payload;
     List * next;

     void prepend(List * newNode) {
         newNode.next = &this;
     }
}

This code can't make it in safe mode because it takes the address of 
this. In general, the compiler must assume that you might have created a 
List object on the stack, e.g.:

List * someFun() {
     List local;
     List * lst = new List;
     local.prepend(lst);
     return lst;
}

Now even if there is no ostensible local address taking, the code is in 
error because it has escaped the address of a local.

So prepend() cannot be compiled. The way to make it compile in safe mode is:


struct List(T) {
     T payload;
     List * next;

     static void prepend(List * zis, List * newNode) {
         newNode.next = zis;
     }
}

Now the code compiles and is actually safe because it is impossible to 
pass the address of a local into prepend.

So get ready to use static a lot more ;o).


Andrei



More information about the Digitalmars-d mailing list