好看的设计网站,无锡建设市场网站,怎么优化标题和关键词排名,关于政协 网站建设原文 以下程序无法用-previewdip1000编译:
void main() safe
{int[3] a [1, 2, 3];int[] slice;//好slice a[];scope ref getSlice() { return slice; }//错误:把对a局部变量的引用赋值给非域getSlice()getSlice() a[];
}getSlice应该可返回可安全地赋值给a[]的引用.
如常…原文 以下程序无法用-previewdip1000编译:
void main() safe
{int[3] a [1, 2, 3];int[] slice;//好slice a[];scope ref getSlice() { return slice; }//错误:把对a局部变量的引用赋值给非域getSlice()getSlice() a[];
}getSlice应该可返回可安全地赋值给a[]的引用.
如常,去掉抽象,化简为仅指针时,更清楚: safe void test(){int i;scope int* p i;scope ref get() { return p; }get() i;}我不太清楚本地函数上的域是否应限定环境指针或返回值.一般,闭包环境是DIP1000不健全的一大根源. 这也会影响非嵌套函数.如:
ref int* getRef(return ref scope int* p) safe
{return p;
}
void main() safe
{int n;scope int* p;getRef(p) n;
}在没有像Rust这样成熟的生命期系统时,不确定接受此代码是否可行,但尽量,那肯定会很方便.
问题是它不认为getRef(p)是p变量.的右侧使用按值或按引用转义的逻辑,而左侧使用只能返回一个变量的表达式到变量,因此它放弃了潜在的多变量式.如:
void main() safe
{int n;scope int* p;(n ? p : p) n;
}错误:把n局部变量的引用赋值给非域*(n?p:p) 这可通过对左边使用相同的按值转义逻辑,并对一切左边变量重复其余的checkAssignEscape逻辑来解决. 它不会有最佳的时间复杂度,但复杂的左边式应该不多.