static struct Foo{
void *ptr;

void proxySwap1(scope ref typeof(this) rhs)scope pure nothrow @trusted @nogc{
auto tmp = this.ptr;
this.ptr = rhs.ptr;
rhs.ptr = tmp;
}
void proxySwap2()(scope ref typeof(this) rhs)scope pure nothrow @trusted @nogc{
this.proxySwap1(rhs);
}
void proxySwap3()(scope ref typeof(this) rhs)scope pure nothrow @trusted @nogc{
auto tmp = this.ptr;
this.ptr = rhs.ptr;
rhs.ptr = tmp;
}//有().
}

void main()@safe{

scope Foo a;
scope Foo b;

a.proxySwap1(b); //OK
a.proxySwap2(b); //OK
a.proxySwap3(b); //错误,把b赋值给更长生命期的a.
}

为何不编译?

​proxySwap1​​​对属性说谎了.它说​​rhs​​​是​​域​​,但用

this.ptr = rhs.ptr;

逃逸了.由于​​@trusted​​,编译器未抛错误.

​proxySwap2​​只是模板包装​​proxySwap1​​,

​proxySwap3​​是模板函数,​​编译器​​推导​​rhs​​为​​return scope​​.

虽然​​@trusted​​允许逃逸​​局部​​变量,​​编译器​​仍在​​参数​​上推导​​scope, return scope或return ref​​.

在​​@safe​​调用者中​​产生​​错误.

在​​@safe​​中不能交换​​域​​变量,因为:

void main() @safe {
scope Foo a;
{
int x;
scope Foo b = Foo(&x);
a.proxySwap3(b); // 同样a<=b,不行.
}
// 现在a是悬挂指针.
}