2311ddip1000不能从函数返回域引用

原文

以下程序无法用-preview=dip1000编译:

cpp 复制代码
void main() @safe
{
    int[3] a = [1, 2, 3];
    int[] slice;
    //好
    slice = a[];
    scope ref getSlice() { return slice; }
    //错误:把对a局部变量的`引用`赋值给非域`getSlice()`
    getSlice() = a[];
}

getSlice应该可返回可安全地赋值给'a[]'的引用.

如常,去掉抽象,化简为仅指针时,更清楚:

cpp 复制代码
  @safe void test()
  {
    int i;
    scope int* p = &i;
    scope ref get() { return p; }
    get() = &i;
  }

我不太清楚本地函数上的"域"是否应限定环境指针或返回值.一般,闭包环境DIP1000不健全的一大根源.

这也会影响非嵌套函数.如:

cpp 复制代码
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"变量.=的右侧使用按值或按引用转义的逻辑,而左侧使用只能返回一个变量的'表达式到变量',因此它放弃了潜在多变量式.如:

cpp 复制代码
void main() @safe
{
    int n;
    scope int* p;
    (n ? p : p) = &n;
}

错误:把"n"局部变量的引用赋值给非域"*(n?&p:&p)"

这可通过对左边使用相同的按值转义逻辑,并对一切左边变量重复其余的checkAssignEscape逻辑来解决.

它不会有最佳时间复杂度,但复杂左边式应该不多.

相关推荐
fqbqrr10 天前
2411d,右值与移动
d
fqbqrr5 个月前
2407d,D2024三月会议
d
fqbqrr8 个月前
2403d,d的com哪里错了
d
fqbqrr10 个月前
2402d,d的变参
d
fqbqrr10 个月前
2401d,ddip1027如何支持sql
d
fqbqrr10 个月前
2401d,讨论d串滑动参数
d
fqbqrr1 年前
2312d,D语言单元测试等
d
fqbqrr1 年前
2312d,d语言作为胶水,用C++调用rust
c++·rust·d
fqbqrr1 年前
2312d,把alloca注入调用者域
d
fqbqrr1 年前
2312d,d语言来绑定C++和rust
c++·rust·d