0
点赞
收藏
分享

微信扫一扫

d奇怪的枚举


​​原文​​

import std.stdio;

enum Foo {
bar
}

int main(string[] args)
{
writefln("调试: %d\n", &(Foo.bar));
return 0;
}

错误:​​bar​​无法修改​​清单​​常量.

​它们​​都不是左值.​​等价结构​​是"​​静态 常和不变​​".在​​编译时​​评估,但有​​地址​​:

static const a = foo();
static immutable b = bar();

int foo() {
return 42;
}

int bar() {
return 43;
}

void main() {
assert(&a != &b);
}

在找​​右值和左值​​相关​​特征​​时,应该有​​isRvalueAssignable()​​和​​isLvalueAssignable()​​:​​这里​​

​Phobos​​文档有点问题.

下面​​8个示例​​中有相同结果.

struct Foo {
int bar;
alias bar this;
auto far() { return &bar; }
}
void main()
{
Foo foo;
// 直接
"1: ".writeln(&foo.bar);
(&foo.bar).writefln!"2. %s";
"3: ".writeln(&(foo.bar));
(&(foo.bar)).writefln!"4. %s";
// 别名
"5. ".writeln(&foo);
(&foo).writefln!"6. %s";
// 函数
"7: ".writeln(&(*foo.far));
(&(*foo.far)).writefln!"8. %s";
}

​枚举​​有两种含义:1,类似​​#define​​,并声明仅在​​编译时​​存在的值.那是明显的​​清单常量​​.

按(如​​const​​)​​存储类​​用​​枚举​​完成.

enum x = 5; // x现在是整清单常量
enum byte y = 5; //y现在是字节清单常量

writeln(&x); // 错误,非左值,等价于:
writeln(&5);

2,声明可以是​​左值​​​的​​类型​​:

enum Foo {
bar
}

Foo foo;
writeln(&foo); // ok

​Foo​​现在是​​类型​​,可用来表示仅​​一个值​​的​​(Foo.bar)​​整数值.尽管可通过​​强制转换​​或​​数学运算​​得到的任何​​int​​值.如果需要,还可指定​​基本类型​​.

一些库按粗略的(带​​额外​​清单常量属性)​​typedef​​用.

​匿名枚举​​是一种​​奇怪​​的声明​​一堆清单常量​​方式,并使用​​"=上个成员+1"​​功能来​​声明​​它们(你可改).

还可用​​无成员​​的​​标识符​​声明​​枚举​​,并成为​​无默认初值​​设定项类型.主要用作方便的​​UDA​​标签.

enum dontSerialize;//uda.
struct S
{
@dontSerialize string comment;
}

​enum​​​绝对是​​D​​​中​​最奇怪​​的东西之一.



举报

相关推荐

0 条评论