On Tuesday, 20 September 2016 at 13:35:27 UTC, Steven Schveighoffer wrote:
Yes, but if your code does instantiate it, it is called, even if you don't ever call the function that calls it.
Yes, it's not ideal but better then just global variable and static block - it's called in any case, even if variable is not used at all.

Ideal solution will be something like attribute for static block leading to make it optional, so module will not be included if no usage of other symbols found. But I don't know way how to make it so template is used.

Note that if you don't import the module that contains the static ctor, it should be trimmed by the linker.
Let's imagine linker can trim even imported module with static ctor, if we have something like:

        immutable string executablePath;

        @local shared static this()
                import std.file : thisExePath;
                executablePath = thisExePath();

and there is no references to executablePath. Here it would be useful, I think. Attribute @local (or @module? the name does not matter) mean this block used only to init other symbols in this module so it can be skipped if no references.

I would absolutely caution you from putting static this() inside any template. Unfortunately, due to the way D generates these static constructors, any module that uses staticMemoize, or *imports a module that uses it*, will be marked as having a static constructor, and will potentially create cycles.
Please be more detail about cycles. Do you mean something like this? https://isocpp.org/wiki/faq/ctors#static-init-order

Reply via email to