这段代码可以通过编译器(为了澄清,生命周期没有省略):
struct Foo<'a> {
_field: &'a i32,
}
fn test<'a, 'b, 'c>(_x: &'a mut Foo<'c>, _y: &'b bool) { // case 1
}
fn main() {
let f = &mut Foo { _field: &0 };
{
let p = false;
test(f, &p);
}
}
如果我在
test
的定义中使用'b
而不是'c
,就像这样:fn test<'a, 'b>(_x: &'a mut Foo<'b>, _y: &'b bool) { // case 2
}
代码无法编译(“p does not live long enough”)!
在情况2中,我期望在调用test
时发生以下情况:
'a
被设置为f
的实际生命周期,'b
被设置为Foo
的实际生命周期和&p
的实际生命周期的交集,即&p
的生命周期,
一切都应该很好,就像情况1一样。
然而,在情况2中实际发生的事情似乎是'b
被强制成Foo
的生命周期,这对于&p
的生命周期来说太大了,因此编译器会报错“p does not live long enough”。是这样吗?
更奇怪的是(情况3):只有在test
采用&mut
时才会失败。如果我保留<'b>
,但删除mut
,就像这样:
fn test<'a, 'b>(_x: &'a Foo<'b>, _y: &'b bool) { // case 3
}
代码再次通过。
有人能解释一下吗?
谢谢。