d的dip1000按域对待引用副本2

Posted fqbqrr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了d的dip1000按域对待引用副本2相关的知识,希望对你有一定的参考价值。


​前文在此​​​,请先阅读.
这里:

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

编译器这样看:

ref return scope T index();

按​​ref​​​和​​return scope​​​附加到​​this​​​.​​a​​​是​​this​​​.由于​​a​​​是​​scope​​​,所以​​a.index()​​​的返回值也是​​scope​​​(​​.1​​​).
然后传递该​​​scope​​​返回值给​​int*​​​参数不是​​scope​​​的​​assign(int*)​​​.
赋值​​​scope​​​给​​非域​​​是错误,编译器会​​正确诊断​​.

​.1​​​就是编译器做错的地方.​​中域​​​应用至​​ref 中​​​,而不是返回的​​int*​​​值.可通过​​如下示例​​展示:

ref int f(ref return scope int* x) @safe

return *x;

​注意​​​返回值是如何​​没有指针​​​的,但是如果​​中域​​​时未注解它,编译器会​​触发​​​错误.如果搞成模板,​​dmd​​​也会按"中域"​​推导​​​它.
​​​中域​​​的作用是防止按​​引用​​​返回​​f(stackPointer)​​​,或逃逸​​&f(stackPointer)​​,但如下有效:

int g() @safe

int x;
int y = f(&x); // `y`不是 `域`,该是什么?
return y; //逃逸f的结果.

原示例​​唯一不同​​​的是,​​指针有效载荷​​​为不同类型​​(int*​​​而不是​​int​​​),这不应影响示例,因为它是间接的第二层,它不应受到​​域或中域​​​的影响.
顺便,我化简原示例为​​​int**​​,因为你一般要求这样,但看原代码:

void scoot(scope Array!string a) @safe

a[0] = a[1];

这显然不违反​​scope​​​并且同​​string[]​​​工作,因此也应同​​库数组类型​​​工作,否则它是​​dip1000​​​的​​糟糕设计​​.

ref X foo(ref return scope P p)
ReturnRef-Scope

与你写的​​一致​​.

(备忘单已经过时了.我的错.还记得我们将​​returnscope​​​更改为始终表示​​Return Scope​​​,而​​ref scope return​​​从不表明​​Ref-ReturnScope​​​吗?)
为了清楚起见,把x更改为​​​p​​:

ref int f(ref return scope int* p) @safe

return *p;

这按​​ref return scope​​​编译.这保护了p的值.而不是p的地址.因为​​p值​​​是返回的值,成功编译.
现在分开​​​return scope​​:

ref int f(ref5 scope return int* p) @safe

return *p;

按​​return ref scope​​​编译.错误:可能未返回​​"p"​​​域变量.两者都正确,​​中域​​​,始终按​​中域​​解释.

原示例​​唯一不同​​​的是,​​指针有效载荷​​​为不同类型(​​int*​​​而不是​​int​​​),这不应影响示例,因为它是间接的第二层,它不应受到​​域或中域​​的影响.

这种差异使​​一切​​​变得不同.
​​​问题​​​是​​代码​​​试图存储受​​域​​​保护的​​int*p​​​值到未受​​域​​​保护的​​*ptr​​​负载指针中.​​dip1000​​​不能做到这一点.必须使用​​@trusted​​.


以上是关于d的dip1000按域对待引用副本2的主要内容,如果未能解决你的问题,请参考以下文章

当有效载荷长度大小大于 1000K 时,无法获得有效载荷响应。(Coap)

printf 对待 *p++ 的方式与对待 p 的方式不同 [重复]

ABAQUS载荷中的弯矩单位问题

HTML5本地存储数据是不是按域分隔存储[重复]

引用方法操作方法

AWS EC2 / Elastic Beanstalk |如何按域列入白名单?