我发现它令人困惑&(*&a)并且&{*&a}行为不同。
详细地说,以下代码编译失败:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
&{*&a};
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
并编译了以下代码:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
&(*&a); // or &*&a;
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
上述代码之间的语义区别是什么?
究竟哪些语言结构会导致所有权的转移?
通过使用{}你移动 a到一个新的范围,那么你玩哪个引用和间接引用。也可以简化为:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
{a};
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
你会遇到同样的问题,现在让我们转向另一个问题。想象一下,您在范围之前有一个参考:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
let aa = &a;
{aa};
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为我们只是移动引用而不是原始对象本身。
*与&然后的操作如何:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
let aa = &a;
&{*aa};
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
cannot move out of *aa which is behind a shared reference由于上述相同的原因,我们得到了一个。
我们没有那个错误,()因为我们在相同的范围内工作,因此没有真正移动到那里。
编辑(摘自评论),一些相关问题:
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |