Should all enums be immutable?

Rainer Schuetze r.sagitario at gmx.de
Mon Apr 4 11:14:53 PDT 2011


Don wrote:
> Jonathan M Davis wrote:
>> Enum values cannot be altered. It is an error to try and assign a 
>> value to an enum. However, the value of an enum isn't really const or 
>> immutable. It's copied every time that the enum is used. This is fine 
>> in cases where the enum is a value type, but it's problematic when the 
>> enum is a reference type. I believe that the classic example is if you 
>> have an AA which is an enum. You copy _the entire_ AA every time it's 
>> referenced. But it's not just AA's. Normal arrays have the problem too.
>>
>> Given that the value of enum must be known at compile time and given 
>> that it cannot be changed, why aren't enums all immutable? What's 
>> gained by making so that every reference to an enum is replaced by its 
>> value rather than actually referencing an immutable value? In most 
>> cases, it could still be replaced by the value (since it's a constant) 
>> if that's more efficient. And in the case of reference types, it would 
>> actually act like a reference type.
>>
>> So, I ask, should enums just all be made automatically immutable 
>> instead of having the current replace when referenced semantics? Is 
>> there a good reason _not_ to make all enums immutable?
> 
> Yes. The ONLY reason those manifest constants exist at all, is so that 
> they don't exist at run time. They have no address. Any case where 
> taking a reference to them works, is a compiler bug.
> 
> Almost all existing enum arrays or AAs are bugs.
> For example, if you have a lookup table which should be used at runtime, 
> it should ALWAYS be defined as const or immutable, not as an enum.

Unfortunately, you currently get the same performance penalty with const 
or immutable arrays as with enum: 
http://d.puremagic.com/issues/show_bug.cgi?id=4298


More information about the Digitalmars-d mailing list