d推导域容易混淆
Posted fqbqrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
会显著减慢
它的速度.
以上是关于d推导域容易混淆的主要内容,如果未能解决你的问题,请参考以下文章