为什么 Rust 编译器要求我限制泛型类型参数的生命周期(错误 E0309)?

2024-01-27

为什么 Rust 编译器会发出错误,要求我限制以下结构中泛型参数的生命周期?

pub struct NewType<'a, T> {
    x: &'a T,
}
error[E0309]: the parameter type `T` may not live long enough
 --> src/main.rs:2:5
  |
2 |     x: &'a T,
  |     ^^^^^^^^
  |
  = help: consider adding an explicit lifetime bound `T: 'a`...
note: ...so that the reference type `&'a T` does not outlive the data it points at
 --> src/main.rs:2:5
  |
2 |     x: &'a T,
  |     ^^^^^^^^

我可以通过更改为来修复它

pub struct NewType<'a, T>
where
    T: 'a,
{
    x: &'a T,
}

我不明白为什么需要添加T: 'a结构定义的一部分。我想不出一种方法可以将其中包含的数据T可能比引用更长久T。所指对象为x需要比NewType结构体和如果T是另一种结构,那么它也需要满足它包含的任何引用的相同标准。

是否有一个具体的例子表明这种类型的注释是必要的,或者 Rust 编译器只是迂腐?


What T: 'a是说任何参考文献T必须比'a.

这意味着您不能执行以下操作:

let mut o: Option<&str> = Some("foo");
let mut nt = NewType { x: &o };  // o has a reference to &'static str, ok.

{
    let s = "bar".to_string();
    let o2: Option<&str> = Some(&s);
    nt.x = &o2;
}

这会很危险,因为nt会有一个悬空引用s块之后。在这种情况下,它会also抱怨o2也活得不够长。

我想不出有什么办法可以让你拥有&'a引用包含较短生命周期引用的内容,并且显然是编译器knows以某种方式(因为它告诉您添加约束)。然而,我认为在某些方面阐明限制是有帮助的,因为它使借用检查器不那么神奇:您可以仅从类型声明和函数签名来推理它,而不必查看字段是如何定义的(通常是实现文档中没有的详细信息)或如何实现函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Rust 编译器要求我限制泛型类型参数的生命周期(错误 E0309)? 的相关文章

随机推荐