Por que os Phobos usa enum para constantes?
Pergunta
Por que os fobos usa enum
Para definir constantes? Por exemplo, em std.math:
enum real E = 2.7182818284590452354L;
Por que não usar um global immutable
? Quais são as vantagens/desvantagens de enum
sobre immutable
?
Solução
- Uma enumeração é apenas um Rvalue, não um LValue. Não tem endereço.
- Uma enumeração pode ser apenas uma constante de tempo de compilação, não uma constante de tempo de execução.
- Enums não adicionam nenhum inchaço ao arquivo de objeto.
- As enumes compilam mais rapidamente e usam menos memória no momento da compilação. Geralmente é insignificante, mas se você estiver fazendo metaprogramação suficientemente complicado, isso pode começar a ser importante.
Em geral, para coisas que são constantes de tempo de compilação em oposição às constantes de tempo de execução, não há desvantagem no uso de uma enumeração e tem as vantagens de tornar suas intenções absolutamente claras e ser marginalmente mais eficientes.
Editar: um outro caso de uso para enumes pode estar desambiguar para o compilador se uma função deve ser avaliada em tempo de execução ou tempo de compilação. Se o resultado de uma função for atribuído a um immutable
Variável de pilha, a função será avaliada em tempo de execução. Se você usar um enum
No mesmo escopo, o resultado será avaliado no momento da compilação.
Outras dicas
Iirc em d enum A = B;
é mais ou menos as mesmas coisas que #define A B
está em C. É sempre subado como literal em qualquer expressão que a use.