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会显著减慢它的速度.
浙公网安备 33010602011771号