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);
}
}
块1 出现以下错误: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中,即使存在对其的外部引用,内部的可变引用也总是被丢弃了吗?
m
被复制的是什么?我的意思是,在这种情况下 `fn main() { let mut m:i32 = 10; let n = { let b = &mut m; *b = 12; &*b };println!("{:?}", n);
}`,它并不是。是因为外部引用触发了复制吗? - soupybionics&mut
和S
之间的相似之处,但这不可能是全部。首先,如果您删除额外的&
层,则[block1将起作用](http://play.rust-lang.org/?gist=80efb0bfa11cccf7add174435a74c4c5&version=stable&mode=debug&edition=2015),而使用`S`的版本仍将无法编译。 - trent&
(即&mut
)的 block1 能够工作,因为它没有涉及到复制(即没有所有权),也没有临时变量(类似于 rvalue?)。所以我想这就是为什么我问是否所有权被占用,因为它是一个临时引用(在&&mut
的情况下)。 - soupybionics&mut m
而不仅仅是m
(根据错误消息在&mut m
下面有^^^^^^
标记整个&mut m
而不仅仅是m
的猜测)。因此,&mut
是临时值,指向m
而不获取所有权(无移动/复制)。如果&mut
获取所有权,那么此代码不应该编译通过才对? 但它通过了。 - soupybionics