在引用类型上实现特征时,如果生命周期未使用,为什么需要生命周期,以Rust<;1.31?

在引用类型上实现特征时,如果生命周期未使用,为什么需要生命周期,以Rust<;1.31?,rust,lifetime,Rust,Lifetime,我正在使用早于1.31的Rust为引用类型实现一个trait当我告诉Rust我要实现该特性的引用类型时,为什么Rust需要显式的生存期? 这里有一个简单的例子。结构英寸,是 为&Inches添加特征,以及使用该实现的函数 初始示例 我添加了缺少的生存期说明符(仍然没有编译) 编译错误: error: use of undeclared lifetime name `'b` [E0261] impl Add for &'b Inches { 我在impl上声明生存期(现在它已编

我正在使用早于1.31的Rust为引用类型实现一个trait当我告诉Rust我要实现该特性的引用类型时,为什么Rust需要显式的生存期?

这里有一个简单的例子。结构
英寸
,是
&Inches
添加特征,以及使用该实现的函数

初始示例

我添加了缺少的生存期说明符(仍然没有编译) 编译错误:

error: use of undeclared lifetime name `'b` [E0261]
    impl Add for &'b Inches {
我在
impl
上声明生存期(现在它已编译)

//was:impl Add for&'b英寸{
不信任1.31及以上版本
原因很简单:它直到Rust 1.31才实现


现在,初始示例已编译,您可以编写
impl Add for&Inches
而不是
impl。提供了“b”的生存期(当然是在编译时)作为+操作中的“a”,允许编译器强制/确保“b out to”a的生存期要求,然后out to main中的变量,对吗?因此,“b本身不是未使用的,它是调用方(可传递的)要求的表达式必须遵守。您的问题已经说明了它适用于哪个版本:我正在使用Rust 1.30为引用类型实现一个trait。我认为生存期,即使被省略规则省略,在概念上仍然存在,并且必须由调用方提供和遵守,不是吗?生存期仍然完全存在。省略规则指示编译器可以如何使用它解决编译时丢失的生命周期问题,避免编写“明显的”,样板注释。是的,调用者必须尊重它们,但反过来,这些调用者可以从代码相关部分的省略中获益。对。因此OP询问的一件事是明显的
未指定…'b
,我的观点是,它不是未指定的,在某种意义上,调用者通过传递i来指定它t in(在编译时有效,调用方的调用方也可以传递),这与(文本)省略是否起作用无关。当然,我可能误解了OP…感谢@ErikEidt和mdup如此仔细地阅读和回答我的问题。您的答案是什么“必须始终存在一个生命周期,无论是显式的还是推断的”(Erik)+“编译器还不能推断出这个生命周期”(mdup),一起回答我问题的两个部分“为什么要增加生命,为什么我不能省略它”。谢谢你们两位。特别感谢你们添加了RFC和该问题的链接。将新用户指向主要来源和论坛对于指导人们在哪里研究答案以及吸引人们加入社区来说是非常宝贵的。
error: missing lifetime specifier [E0106]
    impl Add for &Inches {
                 ^~~~~~~
// was: impl Add for &Inches {
impl Add for &'b Inches {
    ...
}
error: use of undeclared lifetime name `'b` [E0261]
    impl Add for &'b Inches {
// was: impl Add for &'b Inches {
impl<'b> Add for &'b Inches {
    ...
}
impl Reader for BufReader { ... }                       // elided
impl<'a> Reader for BufReader<'a> { .. }                // expanded
impl Add<u8> for u8
impl<'a> Add<u8> for &'a u8
impl<'a> Add<&'a u8> for u8
impl<'a, 'b> Add<&'a u8> for &'b u8