d推导域容易混淆

按期望编译:

int* f()(int* p)
{
    static int g;
    g = 0;
    return new int;
}

int* g() @safe
{
    int x;
    return f(&x);
}

如下不是,但应该:

int* f()(int* p)
{
    static int g;
    g = 0;
    auto p2 = p; /*唯一差别*/
    return new int;
}

int* g() @safe
{
    int x;
    return f(&x);/*错误:调用test.f!().f时赋值,`x`引用给`p`非域参数*/
}

要这样,需要,分析数据流,可以做到,但会大大增加实现复杂性和编译时间.

可这样,来工作:

int* f()(int* p)
{
    static int g;
    g = 0;
    scope p2 = p; /*唯一区别*/
    return new int;
}

int* g() @safe
{
    int x;
    return f(&x); /* 好 */
}

这让我很困惑.示例不包含单个分支或循环.当然,可在此推导而无需创建控制流图,对吗?此外,虽然我不知道当前推理是如何工作的(无记录),但它已经有个非常复杂的循环.

目前,为了推导p的,只需检查p的每个用法是否符合.
为了使示例(和其他类似示例)正常工作,需要递归检查可能赋值"p"的变量(及自身递归赋值)的每次使用(如"p2").
这是图形搜索问题.

问题是,一旦开始搞DFA,人们就想要真正的DFA.前端执行DFA会显著减慢它的速度.

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