当返回对范围外值的可变引用的不可变引用时,为什么在范围结束时丢弃可变引用?
When an immutable reference to a mutable reference to a value outside the scope is returned, why is the mutable reference dropped when the scope ends?
fn main() {
// block1: fails
{
let mut m = 10;
let n = {
let b = &&mut m;
&**b // just returning b fails
};
println!("{:?}", n);
}
// block2: passes
{
let mut m = 10;
let n = {
let b = &&m;
&**b // just returning b fails here too
};
println!("{:?}", n);
}
}
block1 失败并出现错误:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:7:22
|
7 | let b = &&mut m;
| ^^^^^^ temporary value does not live long enough
8 | &**b // just returning b fails
9 | };
| - temporary value dropped here while still borrowed
...
12 | }
| - temporary value needs to live until here
我假设内部不可变引用扩展到 block2 范围之外是否正确,而在 block1 中,内部可变引用即使有外部引用也总是被丢弃?
这里将可变借用视为非Copy
结构(下面代码段中的S
)就足够了,它拥有引用值的所有权。该模型代表了可变借用的排他性。
基于此模型的推理:在 block2 中 n
是对原始 m
的引用,而在 block1 中 n
最终将成为对 [= 的副本的引用15=] 由可变借用拥有。在这两个块中,内部引用在 let 块的末尾被丢弃,但仅在 block1 中这会导致问题,因为在 block1 中,当此内部引用时,n
的引用目标仍由内部引用拥有引用已删除。
struct S { m: i32 }
let mut m = 10;
let n = {
let s = S { m };
let b = &s;
&(*b).m
}; // s is dropped
println!("{:?}", n);
在上面的代码片段中,s
获得了 m
的副本的所有权。引用 n
将指向 n
的副本,该副本在 s
被删除时被删除 - 不允许。如果 m
是非 Copy,m
将被移动到 s
,这将具有相同的含义。
block2中直接借用原文m
,没有复制。如果你强制复制,你会得到与 block1 相同的错误:
let mut m = 10;
let n = {
let m2 = m;
let mut a = &m2;
let b = &a;
&**b
};
println!("{:?}", n);
fn main() {
// block1: fails
{
let mut m = 10;
let n = {
let b = &&mut m;
&**b // just returning b fails
};
println!("{:?}", n);
}
// block2: passes
{
let mut m = 10;
let n = {
let b = &&m;
&**b // just returning b fails here too
};
println!("{:?}", n);
}
}
block1 失败并出现错误:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:7:22
|
7 | let b = &&mut m;
| ^^^^^^ temporary value does not live long enough
8 | &**b // just returning b fails
9 | };
| - temporary value dropped here while still borrowed
...
12 | }
| - temporary value needs to live until here
我假设内部不可变引用扩展到 block2 范围之外是否正确,而在 block1 中,内部可变引用即使有外部引用也总是被丢弃?
这里将可变借用视为非Copy
结构(下面代码段中的S
)就足够了,它拥有引用值的所有权。该模型代表了可变借用的排他性。
基于此模型的推理:在 block2 中 n
是对原始 m
的引用,而在 block1 中 n
最终将成为对 [= 的副本的引用15=] 由可变借用拥有。在这两个块中,内部引用在 let 块的末尾被丢弃,但仅在 block1 中这会导致问题,因为在 block1 中,当此内部引用时,n
的引用目标仍由内部引用拥有引用已删除。
struct S { m: i32 }
let mut m = 10;
let n = {
let s = S { m };
let b = &s;
&(*b).m
}; // s is dropped
println!("{:?}", n);
在上面的代码片段中,s
获得了 m
的副本的所有权。引用 n
将指向 n
的副本,该副本在 s
被删除时被删除 - 不允许。如果 m
是非 Copy,m
将被移动到 s
,这将具有相同的含义。
block2中直接借用原文m
,没有复制。如果你强制复制,你会得到与 block1 相同的错误:
let mut m = 10;
let n = {
let m2 = m;
let mut a = &m2;
let b = &a;
&**b
};
println!("{:?}", n);