在 Rust 中,为什么 `a` 在 `let b = &*&a;` 之后保留所有权?

ysl*_*ing 7 ownership rust

我发现它令人困惑&(*&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)

上述代码之间的语义区别是什么?

究竟哪些语言结构会导致所有权的转移?

Net*_*ave 6

通过使用{}移动 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由于上述相同的原因,我们得到了一个。

我们没有那个错误,()因为我们在相同的范围内工作,因此没有真正移动到那里。

编辑(摘自评论),一些相​​关问题: