Как и в C ++, перечисление в D выглядит как «консервативный целочисленный литерал» ( edit : удивительно, D2 даже поддерживает с плавающей запятой и строки ). Его счетчики не имеют местоположения. Они просто несущественны как ценности без идентичности.
Размещение enum
является новым в D2. Сначала он определяет новую переменную. Это не lvalue (поэтому вы также не можете взять его адрес).
enum int a = 10; // new in D2
Это как
enum : int { a = 10 }
Если я могу доверять своим плохим знаниям D. Таким образом, a
здесь не является lvalue (без местоположения, и вы не можете взять его адрес). Const, однако, имеет адрес. Если у вас есть глобальная (не уверенная, правильная ли это терминология D) константа, компилятор обычно не может ее оптимизировать, потому что он не знает, какие модули могут получить доступ к этой переменной или могут получить ее адрес. Поэтому он должен выделить для него память.
Я думаю, что если у вас есть локальное const, компилятор все равно может оптимизировать его так же, как в C ++, потому что компилятор знает, глядя на его область действия, заинтересован ли кто-либо в его адресе или нет, или все просто принимают его значение.