鉴于此代码:
struct RefWrapper<'a, T> { r: &'a T, }
...编译器抱怨:
错误:参数类型
T
可能活不够长考虑添加显式生命周期绑定,
T: 'a
以便引用类型&'a T
不会超过它指向的数据.
我已经多次看过这个错误了,到目前为止我只是听了编译器,一切都很顺利.但是,考虑更多,我不明白为什么我要写T: 'a
.
据我了解,已经不可能得到这样的参考.有&'a T
暗示有类型的对象T
是至少生存'a
.但是我们不能在所述对象中存储任何引用,这些引用指向具有比生命周期短的数据'a
.这已经导致编译错误.
在这个意义上它已经是不可能得到一个&'a T
地方T
不活得长'a
.因此,附加注释(T: 'a
)不应该是必需的.
我对吗?我错了,如果是的话:如果T: 'a
不需要,我怎么能破坏代码呢?
链接:
RFC介绍语法
另一个可能相关的RFC
bluss.. 19
这是良构规则的一部分.该类型&'a T
只有格式良好T: 'a
("T outlives'a";它是必需的,因为我们有一个我们可以在范围内访问的引用'a
;指向的值也T
需要至少对该范围有效) .
struct RefWrapper<'a, T>
是一种泛型类型,它表示您可以输入生命周期'x
和类型U
并RefWrapper<'x, U>
返回类型.但是,除非要求T: 'a
得到尊重,否则这种类型不一定是格式良好或甚至不能实施.
此要求来自实施细节; 它不一定使T
和'a
一起使用像&'a T
在结构的内部.良构性要求需要提升到结构的公共接口RefWrapper
,因此形成RefWrapper<'_, _>
类型的要求是公开的,即使内部实现不是.
(还有其他地方需要相同的要求,T: 'a
但这是有意义的:
pub fn foo<'a, T>(x: &'a T) { }
我们发现了一个区别:这里的类型&'a T
也是公共API的一部分.)
这是良构规则的一部分.该类型&'a T
只有格式良好T: 'a
("T outlives'a";它是必需的,因为我们有一个我们可以在范围内访问的引用'a
;指向的值也T
需要至少对该范围有效) .
struct RefWrapper<'a, T>
是一种泛型类型,它表示您可以输入生命周期'x
和类型U
并RefWrapper<'x, U>
返回类型.但是,除非要求T: 'a
得到尊重,否则这种类型不一定是格式良好或甚至不能实施.
此要求来自实施细节; 它不一定使T
和'a
一起使用像&'a T
在结构的内部.良构性要求需要提升到结构的公共接口RefWrapper
,因此形成RefWrapper<'_, _>
类型的要求是公开的,即使内部实现不是.
(还有其他地方需要相同的要求,T: 'a
但这是有意义的:
pub fn foo<'a, T>(x: &'a T) { }
我们发现了一个区别:这里的类型&'a T
也是公共API的一部分.)
恭喜,您说得对!从Rust 1.31开始,由于使用RFC 2093,推断T: 'x
对结构的要求超过了要求,而用户键入此限制的要求已被删除:
无需
T: 'x
在结构上使用显式注释。我们将根据结构的字段推断它们的存在。总之,如果该结构包含一个参考,直接或间接地,以T
与寿命'x
,那么我们将推断T: 'x
是一个要求
基本上,在任何情况下都不需要这样做,因此强制程序员将其写出没有太大价值。