local class instance (at module-level)

spir denis.spir at gmail.com
Thu Mar 14 11:05:22 UTC 2019


I desperately try to declare/define/initialise a simple class instance at 
module-level. This is a special (conceptually static and immutable) instance 
used as a "marker", that just should exist and be accessible by methods of this 
class and/or other classes defined in the same module. (Thus I don't care if 
TLS.) I use it as a remplacement for null, to avoid semantic confusion and 
unhelpful segfaults in case of bug.

I have tried a number of options and never manage to do it, including:
* [C/auto/static immutable c0] = new C(0) ;
* C c0 ; c0.i = 0 ;
* defining a static this()
* more...

The most confusing error is:
Error: variable `_base.c0` is a thread-local class and cannot have a static 
initializer. Use `static this()` to initialize instead.

I also could not find any information --for a while, repeatedly, since I can go 
on developing in the meantime, using null instead. I'm bluffed and confused, 
since there is nothing weird in that, is there? (the compiler can just allocate 
it in static mem and take the address)

Reduced test case:
===========================
class C {
     uint i ;
     this (uint i) {
         this.i = i ;
     }
}

// error
auto c0 = new C(0) ;

void main () {
     // ok
     auto c0 = new C(0) ;
}
===========================

I would enjoy an explanation (or a pointer to) in addition to a solution.

Thank you,
diniz

PS: I take the opportnity to ask if I can count on the compiler to intern 
literal strings (which my code may use in several places, including loops), esp. 
"", or should I declare and use (for instance):
static immutable s0 = "" ;


More information about the Digitalmars-d-learn mailing list