On Friday, 1 September 2017 at 21:08:20 UTC, Ali Çehreli wrote:
[snip]
> assert(!([1,2,3] is [1,2,3]));
>
> Which is exactly what enum expands to and totally expected.
Where is the
> surprise?

This is not a surprise. Array literals are not identical.

In the surprising case foo is a symbol, seemingly of a variable. Failing the 'is' test is surprising in that case. I've just remembered that the actual surprising case is the following explicit check:

    assert(!(foo.ptr is foo.ptr)); // Passes

I find it surprising because it looks like an entity does not have a well-behaving .ptr.

(Aside: I think your code might be surprising to at least newcomers as well.)

That's a good reason to unrecommend/disallow enums with indirections. The compiler should recommend/suggest using static immutable instead as it does not have such oddities. The only advantage of enum is being guaranteed to be known at compile-time and they can be templatized (can be also done for static immutable via eponymous template). I'd vote for a warning/error when the type of an enum has indirections together with a pragma to switch the warning off for the rare case you know exactly what you do. Just as Scott Meyers said: make it easy to use correctly and hard to use incorrectly. Today it's easy to use incorrectly.

Reply via email to