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推导域容易混淆的主要内容,如果未能解决你的问题,请参考以下文章

linux 容易混淆的几个基本命令

d禁止新不应禁止域

java四大域总结

js 变量声明易混淆的几点知识

C/C++中变量的作用域和存储类型简介

char和byte是一个意思?