如果引用生命周期与其内容相同,为什么不能两次使用对引用Vec的可变引用?

时间:2019-01-31 12:20:21

标签: rust lifetime

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的内容引用中删除生命周期,就可以正常编译了。

为什么原始代码无法编译?我在这里看不到问题。对我而言,一生中提及向量及其内容意味着该向量及其内容存在相同的“时间”。我在哪里错了?

1 个答案:

答案 0 :(得分:4)

在此功能中:

fn y<'r>(a: &'r mut Vec<&'r A>) {}

您要询问&AVec的(可变)引用具有相同的生存期。如果引用不是可变的,则您会问&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