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