static `this`

Mike via Digitalmars-d digitalmars-d at puremagic.com
Sat Feb 7 16:31:41 PST 2015


I'm elevating this from D.Learn [1] because I think it needs some 
input from the language designers.

This code compiles and executes:
-----------------------------------
import std.stdio;

struct StaticRegister {
     static private uint _value;
     @property static uint value() { return _value; }
     @property static void value(uint v) { _value = v; }

     static alias value this;

     static void test() {
         writeln(this.stringof);
         writeln(typeof(this).stringof);
         writeln(this.value);
     }
}

void main(string[] s) {
     // works due to `alias value this`
     StaticRegister = 1;

     StaticRegister.test();
}
-----------------------------------

Output:
StaticRegister
StaticRegister
1



However, this code fails to compile:
-----------------------------------
struct StaticRegister {
     static void test() {
         assert(this is null);
     }
}

void main(string[] s) {
     StaticRegister.test();
}
-----------------------------------

Output:
test.d(5): Error: 'this' is only defined in non-static member 
functions, not test

To make things more confusing, Bug 380 [2] apparently provided a 
fix for `this` not evaluating in a static context, but it was a 
D1 bug and may not apply to D2.

Is `this` overloaded to mean "this class" in a static context or 
is `this` only valid in a non-static context.  Please clarify, 
and if it's a bug, help me understand so I can make an accurate 
and actionable bug report.

Thanks for the help,
Mike

[1] - "static alias this" thread on D.Learn - 
http://forum.dlang.org/post/xcnwuneclebuyqcjbkwu@forum.dlang.org
[2] - Bug 380 - https://issues.dlang.org/show_bug.cgi?id=380


More information about the Digitalmars-d mailing list