我遇到了借用检查器的某些行为,我觉得这很奇怪:如果我有一个 &'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, 'b: '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
的匿名生命周期,这是一个问题。
总而言之,为什么会这样,我可以采取哪些措施来避免这个问题?