d,cast转换aa为右值

原文
测试用例:

shared int[int] aa;
void main () {
    cast()aa[1] = 1;//违反区间
}

原来工作正常.
你正在aa[1]上抛弃共享.该表达式是访问值,而不是赋值.与定义opIndexopIndexAssign的结构(表达式调用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();.
可变转换为不变更好,因为无未定义行为(只要以后不使用可变引用).丢弃不变,然后修改,确实有未定义行为.

posted @   zjh6  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示