On Thursday, 14 March 2019 at 11:05:22 UTC, spir wrote:
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 = "" ;
Basically, this works for me:
´´´
class C {
uint i ;
this (uint i) {
this.i = i ;
}
}
C c0;
static this()
{
c0 = new C(0);
}
void main () {
assert(!(c0 is null));
}
´´´