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
中最奇怪
的东西之一.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现