struct A;
fn y<'r>(a: &'r mut Vec<&'r A>) {}
fn x<'r>(a: &'r mut Vec<&'r A>) {
y(a);
y(a);
}
此代码的编译失败,表明不能*a
再次可变地借用。当我使签名看起来像这样(a: &'a mut Vec<&A>)
时,即从Vec
的内容引用中删除生命周期,就可以正常编译了。
为什么原始代码无法编译?我在这里看不到问题。对我而言,一生中提及向量及其内容意味着该向量及其内容存在相同的“时间”。我在哪里错了?
答案 0 :(得分:4)
在此功能中:
fn y<'r>(a: &'r mut Vec<&'r A>) {}
您要询问&A
与Vec
的(可变)引用具有相同的生存期。如果引用不是可变的,则您会问&A
的生存期超过了对向量的引用,这不会有问题。但是,可变性使生存期保持不变。
在此功能内:
fn x<'r>(a: &'r mut Vec<&'r A>) {
y(a);
y(a);
}
a
的生存期是函数的整个持续时间,因为它在每个语句中都使用。借位检查器认为(基于y
中生命周期的约束)y
在向量参考的整个生命周期中都需要&A
。因此,第二次调用y
时,它认为引用仍在使用中。
之所以删除显式生存期,是因为借阅检查器会推断出不同的生存期:
fn y<'r, 's>(a: &'r mut Vec<&'s A>) {}
现在它们没有联系在一起,借阅检查员不再认为y
在&A
的整个生命周期中都需要a
。