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

Why does `a` keeps the ownership after `let b = &*&a;` in Rust?

我发现 &(*&a)&{*&a} 的行为不同令人困惑。

具体来说,以下代码编译失败:

struct CanNotCopy;
fn main(){
    let a = CanNotCopy;
    &{*&a};
    let c = a;
}

并编译了以下代码:

struct CanNotCopy;
fn main(){
    let a = CanNotCopy;
    &(*&a); // or &*&a;
    let c = a;
}

以上代码在语义上有什么区别?

准确地说,导致所有权转移的语言结构是什么?

通过使用 {},您正在 移动 a 到一个新的范围,然后您可以在其中进行引用和取消引用。也可以简化为:

struct CanNotCopy;
fn main(){
    let a = CanNotCopy;
    {a};
    let c = a;
}

你会遇到同样的问题,现在让我们转到另一个问题。假设您在范围之前有一个参考:

struct CanNotCopy;
fn main(){
    let a = CanNotCopy;
    let aa = &a;
    {aa};
    let c = a;
}

这行得通,因为我们只是移动了引用而不是原始对象本身。

*&的运算结果如何:

struct CanNotCopy;
fn main(){
    let a = CanNotCopy;
    let aa = &a;
    &{*aa};
    let c = a;
}

由于与上述相同的原因,我们得到了 cannot move out of *aa which is behind a shared reference

我们在 () 中没有那个错误,因为我们在同一范围内工作,因此那里没有任何东西真正移动。

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