0
点赞
收藏
分享

微信扫一扫

d的dip1000仍按域变量对待中引用的副本


​​原文​​​ 出现在​​自定义​​动态​​数组类型​​中.

//用-preview=dip1000编译
@safe:
struct Arr
{
int** ptr;

ref int* index() return scope {
return *ptr;
}

void assign(int* p) scope {
*ptr = p;
}
}

void main()
{
scope Arr a;
a.assign(a.index());
}

因为它按​​ref​​​返回​​域数组​​​元素,​​index​​​是​​return scope​​​.但是,把它传递给​​assign​​​函数时,会传递​​ref return​​​的​​副本​​​,隐式​​解引用​​​它,这样不再是​​域​​​.但是,编译器仍然会报错误:
​​​a​​​域变量赋值给​​非域​​参数.

问题在这:

ref int* index() return scope {
return *ptr;
}

应用​​scope​​​至​​this​​​引用,在本例中为​​ptr​​​.尽管​​*ptr​​​不是​​scope​​​,因为​​scope​​​不是传递的,因为给它讲了,编译器转移​​scope​​​到返回值.(这是一项​​功能​​​,而不是错误.)
​​​基本​​​问题是代码使域有​​传递性​​​,但不行.有时,代码必须用​​@trusted​​代码才能使其工作.

不,"​​中域​​​"​​注解​​​是正确的.因为我按​​ref​​​取解引用地址,为返回它,​​*ptr​​​再次变为​​scope​​​.如果按仅​​域​​​标记​​index​​​,编译器会正确地抱怨​​return*ptr​​​:错误:​​可能​​​不会返回​​this​​​域变量.
不,我的​​​数组​​​结构与​​动态数组​​​完全一样.它不是让​​域指针​​​作为​​数组元素​​.


举报

相关推荐

0 条评论