On Sunday, 22 September 2013 at 21:18:13 UTC, Michael wrote:
This:
//----
auto eventObserver = new Event!DelegateType();
//----
Does not do what you think it does: It *statically*
initializes "eventObserver" to the *single* "new
Event!DelegateType();". SO basically, all your instances are
sharing the same Event.
I'm surprised this compiles at all, what with Fire.init
depending on a run-time call, but apparently, dmd is "smart
enough" to do the allocation at compile time.
Why like "static"?
Because that is the definition of inline initialization.
Basically, every type (struct/class) has a ".init" state, which
is a compile-time known static initial value.
So when you write "auto a = new A;" It means a resolves to the
*value* which is the result of "new A". This is not to be
confused with the *expression*.
In any case, I think the code is wrong to begin with, since you
are basically using a non shared to access a non-TLS global.
I'm filing a bug report right now.