为什么 Rust 不允许您使用嵌套可变引用的最内层生命周期?

问题描述

我遇到了借用检查器的某些行为,我觉得这很奇怪:如果我有一个 &'a mut &'b mut T where 'b: 'a,T: 'b,似乎我应该能够将它视为一个 { {1}},因为我可以保证我对 &'b mut T 的访问权限至少与 T 一样长。因此,以最简单的形式,(我认为)我应该能够创建这样的函数

'b

然而,借阅检查员不喜欢那样,说

fn f<'a,'b: 'a,T: 'b>(x: &'a mut &'b mut T) -> &'b mut T {
  *x
}

我的主要问题是,为什么?

我的第二个问题是,有没有安全的方法解决这个问题? 我知道我可以将它转换为一个指针,然后将它转换回一个引用,在这个过程中神奇地召唤我想要的任何生命周期,但这需要 error[E0623]: lifetime mismatch --> src/main.rs:6:5 | 5 | fn f<'a,T: 'b>(x: &'a mut &'b mut T) -> &'b mut T { | ----------------- | | | these two types are declared with different lifetimes... 6 | *x | ^^ ...but data from `x` flows into `x` here 代码。我想知道是否有安全的方法可以做到这一点,无论是在一般情况下还是在特定情况下(包括特定 unsafe 代码可以被程序员验证为安全的情况)。

举个例子,我的实际用例是一个迭代器,它返回可变引用,如 unsafe 和迭代器系列;我有一些类似的东西

std::slice::IterMut<'a,T>

问题是在 struct IterMut<'a,T> { source: &'a mut MyContainer<T>,... /* other data for iterating */ } impl<'a,T> Iterator for IterMut<'a,T> { type Item = &'a mut T; fn next(&mut self) -> Option<&'a mut T> { ... } } 方法内部,我只能通过 next 访问 source 引用,有效地创建了一个 &mut self,这限制了我的借用能力从 &mut &'a MyContainer<T>source 的匿名生命周期,这是一个问题。

总而言之,为什么会这样,我可以采取哪些措施来避免这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)