Enums 为什么Phobos对常量使用枚举?

Enums 为什么Phobos对常量使用枚举?,enums,d,phobos,Enums,D,Phobos,为什么Phobos使用enum来定义常量?例如,在std.math中: enum real E = 2.7182818284590452354L; 为什么不使用全局的不可变的?enum与不可变相比有哪些优点/缺点 枚举只是右值,不是左值。它没有地址 枚举只能是编译时常量,不能是运行时常量 枚举不会向对象文件添加任何膨胀 枚举编译速度更快,编译时使用的内存更少。通常这是可以忽略的,但如果你正在做足够复杂的元编程,它就开始起作用了 一般来说,对于编译时常量而不是运行时常量的对象,使用枚举并没有缺点

为什么Phobos使用
enum
来定义常量?例如,在std.math中:

enum real E = 2.7182818284590452354L;
为什么不使用全局的
不可变的
enum
不可变
相比有哪些优点/缺点

  • 枚举只是右值,不是左值。它没有地址
  • 枚举只能是编译时常量,不能是运行时常量
  • 枚举不会向对象文件添加任何膨胀
  • 枚举编译速度更快,编译时使用的内存更少。通常这是可以忽略的,但如果你正在做足够复杂的元编程,它就开始起作用了
  • 一般来说,对于编译时常量而不是运行时常量的对象,使用枚举并没有缺点,它的优点是使您的意图绝对清晰,并且效率略高


    编辑:枚举的另一个用例可以使编译器消除对函数应该在运行时还是编译时求值的歧义。如果函数的结果被分配给
    不可变的
    堆栈变量,则函数将在运行时进行计算。如果在同一范围内使用
    enum
    ,则将在编译时对结果进行评估。

    IIRC in D
    enum A=B
    与C中的定义B差不多。在任何使用它的表达式中,它总是作为一个字面值存在