Allow illegal code in enum initialization?

Ali Çehreli acehreli at yahoo.com
Wed Oct 23 09:27:46 PDT 2013


On 10/23/2013 02:55 AM, simendsjo wrote:
> Illegal code is accepted in static if, but not in enum declarations.
> This leads to having three lines when one is enough. Is this just an
> oversight, or by design?
>
> template T(alias A) {
>      enum T = true;
> }
>
> void main() {
>      struct S { }
>      static if(__traits(compiles, S.a) && T!(S.a)) // ok
>          enum e1 = true;
>      else
>          enum e1 = false;
>      enum e2 = __traits(compiles, S.a) && T!(S.a); // No property S.a
> }

I don't know whether it is even specified but it feels like a feature to me.

Just like the shortcut behavior of runtime if helps with avoiding 
illegal memory accesses, this helps with avoiding illegal code altogether:

// null access avoided
if ((p !is null) && (p.member == 42))

// illegal code avoided
static if (__traits(compiles, S.a) && (S.a == 42))

Ali



More information about the Digitalmars-d-learn mailing list