【问题标题】:Why does `a` keeps the ownership after `let b = &*&a;` in Rust? [duplicate]为什么在 Rust 中 `let b = &*&a;` 之后`a` 保留所有权? [复制]
【发布时间】:2021-06-12 12:45:29
【问题描述】:

我发现 &(*&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;
}

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

准确地说,哪些语言结构会导致所有权转移?

【问题讨论】:

  • (){} 本身是不同的,第一个只是修改了操作的顺序,而第二个创建了一个新的嵌套范围。
  • @Netwave 感谢您的评论。我知道(){} 在概念上是不同的,但是更精确的描述(例如,转移所有权的语言结构列表)会让事情更清楚。很抱歉,我尝试过并没有在互联网上找到此类材料。语言参考确实描述了这些东西,但是对于初学者来说阅读语言参考太难了。
  • Block Expressions,最后一段(在最后一个代码 sn-p 之前)。
  • @Masklinn 有帮助!

标签: rust ownership


【解决方案1】:

通过使用{},您将移动 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

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

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

【讨论】:

猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2011-08-10
  • 2020-04-02
  • 2019-01-19
相关资源
最近更新 更多