enum pointers or class references limitation

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Wed Aug 30 05:28:10 PDT 2017


On 30.08.2017 11:36, Dmitry Olshansky wrote:
> The subj is not (any longer) supported by compiler. In fact it used to 
> produce wrong code sometimes and now it just plainly rejects it.
> 
> It's freaking inconvenient because I can't deploy new compile-time 
> std.regex w/o it.
> 
> The example:
> 
> enum ctr = ctRegex!"blah";
> 
> after my changes must be:
> 
> static immutable ctr = ctRegex!"blah";
> 
> Howeever I divised a trick to get equivalent functionality as follows:
> 
> template ctRegexImpl(alias pattern, string flags=[])
> {
>     static immutable staticRe = ...;
>     struct Wrapper
>     {
>        @property auto getRe(){ return staticRe; }
>        alias getRe this;
>     }
>     enum wrapper = Wrapper();
> }
> 
> public enum ctRegex(alias pattern, alias flags=[]) = 
> ctRegexImpl!(pattern, flags).wrapper;
> 
> Now ctRegex returns a neat forwarding struct that bypasses the strange 
> limitation. The question remains though - why can't compiler do it 
> automatically?
> 

I think the underlying reason why it does not work is that dynamic array 
manifest constants are messed up. I.e. class reference `enum`s are 
disallowed in order to avoid having to make a decision for either 
inconsistent or insane semantics.


More information about the Digitalmars-d mailing list