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

我发现它令人困惑&(*&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由于上述相同的原因,我们得到了一个。

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

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

  • “&*” 在 Rust 中有什么作用

  • &mut unsafe { } 和 unsafe { &mut } 有什么区别?


以上是在Rust中,为什么`a`在`letb=&*&a;`之后保留所有权?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>