鉴于此代码:
struct RefWrapper<'a, T> {
r: &'a T,
}
...编译器抱怨:
错误:参数类型T
可能活得不够长
考虑添加显式生命周期界限T: 'a
这样引用类型&'a T
不会比它所指向的数据更长久。
我已经多次看到这个错误,到目前为止我只是听了编译器的声音,一切都很顺利。然而,再想一想,我就不明白了why我必须写T: 'a
.
据我了解,这是already不可能得到这样的参考。拥有&'a T
意味着存在一个类型的对象T
至少存活'a
。但是我们不能在该对象中存储任何指向生命周期短于'a
。这个会already导致编译器错误。
从这个意义上说,已经不可能获得&'a T
where T
不会过时'a
。因此附加注释(T: 'a
)应该没有必要。
我对吗?我错了吗?如果是的话:我怎么能破坏代码,如果T: 'a
不需要吗?
Links:
- RFC 介绍语法 https://github.com/rust-lang/rfcs/blob/master/text/0192-bounds-on-object-and-generic-types.md
- 另一个可能相关的 RFC https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
这是格式良好规则的一部分。方式&'a T
仅当T: 'a
(“T 比 'a” 寿命更长;这是必需的,因为我们有一个可以在范围内访问的引用'a
;中的指向值T
也需要至少在该范围内有效)。
struct RefWrapper<'a, T>
是一个通用类型,它说你可以输入一个生命周期'x
和一个类型U
并得到一个RefWrapper<'x, U>
输入回来。然而,这种类型不一定是格式良好的,甚至不一定是实现的,除非有要求T: 'a
受到尊重。
这个要求来自于一个实现细节;不一定是这样T
and 'a
一起使用就像&'a T
在结构的内部。良好成形性要求需要提升到公共接口RefWrapper
struct,以便形成一个RefWrapper<'_, _>
类型是公共的,即使内部实现不是公共的。
(还有其他地方有同样的要求T: 'a
返回但是隐式的:
pub fn foo<'a, T>(x: &'a T) { }
我们发现了一个区别:这里是类型&'a T
也是公共 API 的一部分。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)