为什么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编译器只是迂腐?
1 回答
T: 'a
所说的是T
中的任何引用都必须比'a
更长 .这意味着你不能做以下事情:
这将是危险的,因为
nt
将在块之后对s
进行悬空引用 . 在这种情况下,它也会抱怨o2
也没有足够长的时间 .我想不出一种方法可以让
&'a
引用包含更短生命周期引用的东西,显然编译器以某种方式知道这一点(因为它在某些方面有助于说明限制,因为它使得借用检查器不那么神奇:你可以仅仅通过类型声明和函数签名来推理它,而不必查看字段是如何定义的(通常是文档中没有的实现细节)或函数的实现方式 .