Andrei Alexandrescu:

I do agree that it's wrong to _conflate_ the enumerated value with it ordinal, so in this program neither comparison should compile without an explicit cast:

enum E1 { A, B }
enum E2 { C, D }

void main() {
    E1 a;
    assert(a == 0);
    assert(a == E2.C);
}

The first one is probably difficult to disallow at this time,

I filed this first problem in 2010-03 (I have not filed the Enum1==Enum2 problem yet):
http://d.puremagic.com/issues/show_bug.cgi?id=3999

This is a small breaking change, but it doesn't introduce bugs in already written code, it turns into compile-time errors code that currently compiles. I think the usual way to solve this compile-time error is to use a cast (or sometimes use this safe to!() enhancement: http://d.puremagic.com/issues/show_bug.cgi?id=8143 ).


C++11 has "solved" this compatibility problem creating another kind of enum, referred as "enum class":

enum class Foo { V1 = 10 };
int main() {
    int b = Foo::V1 == 10;
}


test.cpp: In function 'int main()':
test.cpp:3: error: no match for 'operator==' in '(Foo)10 == 10'
test.cpp:3: note: candidates are: operator==(int, int) <built-in>

The disadvantage of doing this is the complexity increase of the language.

I don't know how do you estimate how much difficult is to perform small breaking changes in the language.

Bye,
bearophile

Reply via email to