为什么 `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
。
我们在 ()
中没有那个错误,因为我们在同一范围内工作,因此那里没有任何东西真正移动。
编辑(取自评论),一些相关问题:
我发现 &(*&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
。
我们在 ()
中没有那个错误,因为我们在同一范围内工作,因此那里没有任何东西真正移动。
编辑(取自评论),一些相关问题: