Почему Фобос использует enum для определения констант? Например, в std.math:
enum real E = 2.7182818284590452354L;
Почему бы не использовать глобальный immutable? Каковы преимущества/недостатки enum над immutable?
Ответ 1
Перечисление - это только значение r, а не lvalue. У него нет адреса.
Перечислением может быть только константа времени компиляции, а не константа времени выполнения.
Перечисления не добавляют никакого налета в объектный файл.
Перечисление выполняется быстрее и использует меньше памяти во время компиляции. Обычно это незначительно, но если вы выполняете достаточно сложное метапрограммирование, это может начать иметь значение.
В общем, для вещей, которые являются константами времени компиляции, в отличие от констант времени выполнения, нет никакого недостатка в использовании перечисления, и у него есть преимущества сделать ваши намерения абсолютно ясными и быть менее эффективными.
Изменить: другой вариант использования для перечислений может быть несовместимым с компилятором, следует ли оценивать функцию во время выполнения или время компиляции. Если результат функции присваивается переменной стека immutable, функция будет оцениваться во время выполнения. Если вы используете enum в той же области видимости, результат будет оцениваться во время компиляции.
Ответ 2
IIRC в D enum A = B; является более или менее теми же вещами, что и #define A B в C. Он всегда подчиняется в качестве литерала в любом выражении, которое его использует.