Allow illegal code in enum initialization?
simendsjo
simendsjo at gmail.com
Wed Oct 23 13:02:05 PDT 2013
On Wednesday, 23 October 2013 at 16:27:47 UTC, Ali Çehreli wrote:
> 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
The question is if it would make sense to allow it for enum as
well as static if. As enum is a compile-time constant I think it
would be consistent.
More information about the Digitalmars-d-learn
mailing list