At present (though it didn't used to work this way until about 4 months ago - 
the change is in 2.060), a number of std.traits templates - including 
isSomeString - evaluate to false for enums. So,

enum E : string { a = "hello" }
static assert(isSomeString!(E.a));

will fail. This is in spite of the fact that

auto func(string a) {...}

will accept E.a without complaint. So, if you change

auto func(string a) {...}

to

auto func(T)(T a) if(isSomeString!T) {...}

any code passing E.a to func would be broken. Personally, I don't see why 
isSomeString shouldn't consider enums which are strings to be strings (the 
same goes for isUnsigned, isIntegral, etc.), especially when the language 
itself does.

Kenji is argues that they shouldn't because they should treat enums as 
strongly typed:

https://github.com/D-Programming-
Language/phobos/commit/52462bec6ea846f30e8dac309d63ccb4101e8f0c#commitcomment-1671599

But the language itself doesn't and I think that this a real problem given 
that it's very common to use stuff like isSomeString in template constraints, 
and I don't think that much of anyone is considering how that effects enums.

I agree that an enum's base type should not implicitly convert to the enum 
type, since that would mean that you could have an invalid enum value, but I 
see no problem with enums implicitly converted to their base type.

I think that the change to std.traits was a big mistake and will probably file 
it as a regression, but I thought that I should get other people's thoughts on 
this.

- Jonathan M Davis

Reply via email to