d,cast转换aa为右值
原文
测试用例:
shared int[int] aa;
void main () {
cast()aa[1] = 1;//违反区间
}
原来工作正常.
你正在aa[1]
上抛弃共享
.该表达式是访问值
,而不是赋值
.与定义opIndex
和opIndexAssign
的结构(表达式调用opIndex
,而不是opIndexAssign
)是一致的.
如果使用cast()(aa[1])=1
,即使在旧版本上也会出现区间错误.为何曾经奏效
?
我认为旧编译器解析其为也适合
新编译器
且无区间错误的(cast()aa)[1]
.
本例,aa
也是immutable
.我知道使它
工作的唯一方法
现在非常丑陋(丢弃不变也许就该丑?):
shared immutable int[int] aa;
void main () {
// (cast()aa)[1] = 1; // 无不变仍工作,
(*cast(int[int]*)(&aa))[1] = 1;//这样?
}
有静态共享构造器
:
shared static this()
{
aa[1] = 1; /*不必强制转换*/
}
但这样不行的:
void f() {
aa[1] = 1; // 错误
}
shared static this()
{
f();//f仍然是模板,模板插件,仍不管用
//在f嵌套函数中不能初化aa不变量
}
如果可在pure
函数中构建数组
的可变版本,则可这样做:
int[int] make_aa() pure
{
int[int] maa;
maa[1] = 1; /*或函数调用等等*/
return maa;
}
immutable int[int] aa;
shared static this()
{
aa = make_aa();
}
如果不能在pure
函数中这样,则可用cast
来这样:aa=cast(immutable)make_aa();
.
从可变
转换为不变
更好,因为无未定义行为
(只要以后不使用可变
引用).丢弃不变
,然后修改
,确实有未定义行为
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现